我的主要编程语言j最近是开源的。为了改进它,我正在研究用C语言编写的源代码。
但是自从我读过或写过C以来,这已经很久了(!),而我当时并不擅长。编写这个特定代码库的方式是......特殊的(许多APL解释器,其中的J,其源代码以高级“APL风格”编写,即使用低级语言编写;非常简洁,冗余避免,重大的宏观使用等。)
目前,我正在尝试了解它采用的基本数据结构。最基本的一个是the typedef A
(“A”代表“array”):
typedef struct {I k,flag,m,t,c,n,r,s[1];}* A;
我理解很好。但是我正在努力绕过AF
是什么,后两行:
typedef A (*AF)();
这种语法是什么意思?特别是,当事情后来被宣布为“AF型”时,它意味着什么? AF
只是指向A
?
我的直接目标是解释包含type V
(对于“verb”)的内存转储,其前两个成员是AF
s:
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
但是我的总体目标比这更大,所以请详细说明AF定义中使用的语法。
答案 0 :(得分:13)
AF
是函数指针的typedef。具体来说,AF
引用指向函数的指针,该函数接收未指定数量的参数并返回类型A
的结果。
答案 1 :(得分:13)
正如已经回答的那样,AF
(数组函数)是指向返回A
(数组对象指针)的函数的指针。
在V
(动词,即。函数对象)的定义中,有两个AF
。 v1
是指向monadic函数实现的指针,v2
是指向二元函数的指针。如果V
代表运算符(副词),那么v1
和v2
仍然分别是monadic和dyadic实现,还有f
g
和{{ 1}}可用于保存(curried)左和/或右参数。 h
mr
和lr
分别是monadic-rank,left-rank和right-rank。并且rr
拥有操作码,因此仍然可以从结构中恢复可打印的表示。
如果id
f
或g
中的任何操作数本身都是动词,则它们的h
结构将分别位于超过* f的f-> k字节处对于g和h,就像所有“有效载荷数据”一样。
我发现了一个非常有用的链接,用于理解J实现中的基本类型是Roger Hui BAA talk notes(2.69M扫描pdf)。完整的文章是Implementation of J(html)。
您可能还会发现my primitive clone具有指导意义。另请参阅我的问题here和here。
答案 2 :(得分:12)
让我们忽略A
实际上是什么。你有
typedef int (*AF)();
AF
是一个指向函数的指针(也就是函数指针),它接受任意数量的参数并返回int
。显然,通过用int
替换A
,除了返回类型之外,内容基本相同;因此,最终结果将AF
限定为函数的指针,该函数接受任意数量的参数并返回A
,这是指向匿名结构的指针的别名。
有一个interesting网站可以帮助您在人类可读的文本中转换复杂的声明。