是否可以在C中使用Lisp语法和前缀表示法?

时间:2014-04-03 16:05:05

标签: c macros lisp

是否有可能以某种方式使用C宏来制作前缀表示法和/或Lisp语法?例如,我想为C编译器编写(f a b)而不是f(a, b);。 只是为了好玩!

2 个答案:

答案 0 :(得分:0)

在Lisp语言中,特别是在ANSI-Specified Common Lisp方言中,代码处理的方式与C / C ++编译器的方式大不相同,这允许Common Lisp宏做 - 和此外, - 与其他非Lisp语言中的宏完全不同。

Lisp解释有三个阶段。首先是读取阶段,在此期间读取代码并将某些定义的字符扩展为Common Lisp代码。

1)读取时间 - 在此阶段,所有已定义,已调度,等等,宏字符将扩展为常用的lisp表单/代码,以便稍后进行评估。 2)编译时间 - 在此阶段,所有定义都会发生,并且过程将存储在(可能)指定的命名空间中的内存中,并使用给定的名称在以下位置引用它们: 3)运行时间 - 在此期间,程序基本上正在运行,剩下的就是调用阶段1和阶段1中构建的程序。 2在Lisp REPL中。

解释语言更有可能支持Common Lisp的宏定义系统提供给我们的疯狂定制选项。例如,我可以很容易地改变我的REPL,如果我用以下形式提供它:

  

CL_USER> (预测(睡眠10)(格式*标准输出*"〜%〜%10秒已经过去,通用时间戳现在是〜%〜%〜#34;(获取通用时间))& ;

......我可能已经定义了角色#\&至于将它关闭的表达式,将其写入lambda函数,并将该函数放入一个线程进程,立即将REPL /提示返回给用户,10秒后(允许解释整个时间)格式化一条短消息标准输出。

不幸的是,C& C ++并不是真正为这种自定义而构建的。

无论你做了什么,我都会想到答案是"在Common Lisp"中完成整个事情。老实说,我不是出于偏见或精英主义,而是出于简单的经验和多年观察的好处。

虽然我接近它,但我只是称之为它并以绝对主观意见结束:我观察到我尊重的所有程序员以及他们正在做的事情在黑客社区中值得尊重的工作最终最终使用Common Lisp作为他们的主要操作模式。

答案 1 :(得分:-1)

  

是否有可能以某种方式使用C宏来制作前缀表示法和/或   Lisp语法?

可能。

  

例如,我想写(f a b)而不是f(a,b);对于C.   编译器

No, you do not want to do that.

  

只是为了好玩!

享受The International Obfuscated C Code Contest