- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的主要编程语言,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
:
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
但我的总体目标远不止于此,所以请详细说明 AF 定义中使用的语法。
最佳答案
正如已经回答的那样,AF
(数组函数)是一个指向函数的指针,该函数返回一个A
(数组对象 指针)。
在V
(Verb,即函数对象)的定义中,有两个AF
。 v1
是指向 monadic 函数实现的指针,v2
是指向 dyadic 函数的指针。如果 V
表示一个运算符(副词),那么 v1
和 v2
仍然分别是 monadic 和 dyadic 实现,而且 f
g
和 h
可用于保存(柯里化(Currying))左和/或右参数。 mr
lr
和 rr
分别是一元秩、左秩和右秩。 id
包含一个操作码,因此仍然可以从该结构中恢复可打印的表示形式。
如果 f
g
或 h
中的任何操作数本身就是动词,则它们的 V
结构将是在 *f 之后的 f->k 个字节处,分别用于 g 和 h,就像所有“有效载荷数据”一样。
我发现一个对理解 J 实现中的基本类型非常有用的链接是 Roger Hui BAA talk notes (2.69M 扫描的 pdf)。完整的文章在Implementation of J (html).
您可能还会找到 my primitive clone有启发性的。另请参阅我的问题 here和 here .
关于c - typedef A (*AF)() 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31948392/
我是一名优秀的程序员,十分优秀!