typedef A (*AF)() 是什么意思?
What does typedef A (*AF)() mean?
我的主要编程语言 j 最近开源了。为了改进它,我正在研究用 C 编写的源代码。
但是我已经有很长 (!) 时间没读过或写过 C 语言了,那时我什至都不擅长。这个特定代码库的编写方式是......特殊的(许多 APL 解释器,其中有 J,其源代码是用高级 "APL style" 编写的,即使是用低级语言编写的;非常简洁,冗余回避、大量使用宏等)
目前,我正在尝试了解它使用的基本数据结构。最基本的是 the typedef A
("A" is for "array"):
typedef struct {I k,flag,m,t,c,n,r,s[1];}* A;
我明白了。但我正在努力思考 AF
是什么,两行之后:
typedef A (*AF)();
这个语法是什么意思?特别是,当事物后来声明为 "type AF" 时,这意味着什么? AF
只是指向 A
的指针吗?
我的直接目标是解释内存转储,其中包括 type V
(for "verb") 的内容,其前两个成员是 AF
s:
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
但我的总体目标远不止于此,所以请详细说明 AF 定义中使用的语法。
AF
是函数指针的类型定义。具体来说,AF
指的是一个指向函数的指针,该函数采用未指定数量的参数,return 是 A
.
类型的结果。
让我们忽略 A
实际上是什么。然后你有
typedef int (*AF)();
AF
是一个指向函数的指针(又名函数指针),它接受任意数量的参数和 returns 一个 int
。显然,将int
替换为A
,除了return类型外,内容基本相同;因此,最终结果将 AF
限定为一个指向函数的指针,该函数接受任意数量的参数,并且 returning A
,一个指向匿名结构的指针的别名。
有一个 interesting 站点可以帮助将复杂的声明转换为人类可读的文本。
正如已经回答的那样,AF
(数组函数)是指向函数的指针,returns 和 A
(数组对象指针)。
在V
(Verb,即函数对象)的定义中,有两个AF
。 v1
是指向 monadic 函数实现的指针,v2
是指向 dyadic 函数的指针。如果 V
表示一个运算符(副词),那么 v1
和 v2
仍然分别是一元和二元实现,而且 f
g
和 h
可用于保存(柯里化)左 and/or 右参数。 mr
lr
和 rr
分别是一元秩、左秩和右秩。并且 id
持有一个 操作码 因此仍然可以从结构中恢复可打印的表示形式。
如果 f
g
或 h
中的任何操作数本身就是动词,则它们的 V
结构将位于 *f 之后的 f->k 个字节处,分别为 g 和 h,像所有 "payload data".
我发现对于理解 J 实现中的基本类型非常有用的 link 是 Roger Hui BAA talk notes (2.69M scanned pdf). And the full write-up is at Implementation of J (html).
您可能还会发现 my primitive clone instructive. See also my questions and 。
我的主要编程语言 j 最近开源了。为了改进它,我正在研究用 C 编写的源代码。
但是我已经有很长 (!) 时间没读过或写过 C 语言了,那时我什至都不擅长。这个特定代码库的编写方式是......特殊的(许多 APL 解释器,其中有 J,其源代码是用高级 "APL style" 编写的,即使是用低级语言编写的;非常简洁,冗余回避、大量使用宏等)
目前,我正在尝试了解它使用的基本数据结构。最基本的是 the typedef A
("A" is for "array"):
typedef struct {I k,flag,m,t,c,n,r,s[1];}* A;
我明白了。但我正在努力思考 AF
是什么,两行之后:
typedef A (*AF)();
这个语法是什么意思?特别是,当事物后来声明为 "type AF" 时,这意味着什么? AF
只是指向 A
的指针吗?
我的直接目标是解释内存转储,其中包括 type V
(for "verb") 的内容,其前两个成员是 AF
s:
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
但我的总体目标远不止于此,所以请详细说明 AF 定义中使用的语法。
AF
是函数指针的类型定义。具体来说,AF
指的是一个指向函数的指针,该函数采用未指定数量的参数,return 是 A
.
让我们忽略 A
实际上是什么。然后你有
typedef int (*AF)();
AF
是一个指向函数的指针(又名函数指针),它接受任意数量的参数和 returns 一个 int
。显然,将int
替换为A
,除了return类型外,内容基本相同;因此,最终结果将 AF
限定为一个指向函数的指针,该函数接受任意数量的参数,并且 returning A
,一个指向匿名结构的指针的别名。
有一个 interesting 站点可以帮助将复杂的声明转换为人类可读的文本。
正如已经回答的那样,AF
(数组函数)是指向函数的指针,returns 和 A
(数组对象指针)。
在V
(Verb,即函数对象)的定义中,有两个AF
。 v1
是指向 monadic 函数实现的指针,v2
是指向 dyadic 函数的指针。如果 V
表示一个运算符(副词),那么 v1
和 v2
仍然分别是一元和二元实现,而且 f
g
和 h
可用于保存(柯里化)左 and/or 右参数。 mr
lr
和 rr
分别是一元秩、左秩和右秩。并且 id
持有一个 操作码 因此仍然可以从结构中恢复可打印的表示形式。
如果 f
g
或 h
中的任何操作数本身就是动词,则它们的 V
结构将位于 *f 之后的 f->k 个字节处,分别为 g 和 h,像所有 "payload data".
我发现对于理解 J 实现中的基本类型非常有用的 link 是 Roger Hui BAA talk notes (2.69M scanned pdf). And the full write-up is at Implementation of J (html).
您可能还会发现 my primitive clone instructive. See also my questions