【问题标题】:Making lisp evaluator using C macros [closed]使用 C 宏制作 lisp 评估器 [关闭]
【发布时间】:2023-03-08 15:05:02
【问题描述】:

我正在阅读有关 C 宏系统的章节,发现我可以定义一些简单的类似 lisp 的求值器。

#define add(x,y) ((x)+(y))
#define mult(x,y) ((x)*(y))
#define sub(x,y) ((x)-(y))
#define eval(x) main(){printf("%d\n",(x));}

eval( mult (sub(10,2) ,  add(6,2)))

当然这只是个玩笑,但是有没有机会用宏系统做完整的方案评估器?

【问题讨论】:

  • 在我看来不像 lisp...

标签: c macros scheme lisp


【解决方案1】:

不,宏不完整。另一方面,C++ 模板是图灵完备的,它是一种严格的函数式语言,但可以用它编写类似 lisp 的东西,以便在编译时创建函数。但是,它的编译速度可能会很慢,会占用大量内存。

【讨论】:

  • 谢谢,很有趣。
【解决方案2】:

这里有一个用宏实现的类似 C 的小型子集。

要调用任何LISP,您需要完全用括号括起来的Polish prefix 表示法。例如。在 C 中你会写 5 + 5 而在 LISP 中你会写 (+ 5 5)。在 C 中你可以写成10 + 3 + 6 - 1,在 Lisp 中你可以写成(- (+ 10 3 6) 1)

如果您对如何实现 LISP 语言感兴趣,您可能会对 Peter Michaux 的Bootstrap Scheme 感兴趣,然后尝试创建自己的语言。这是一个非常好的练习,它教你 LISP 的美妙世界以及如何制作解释器/编译器(取决于你最终会做什么),并且你在 LISP 和你选择的实现它的语言方面都会变得更好。

如果您不熟悉 LISP 语言,您可能需要在开始之前学习一点 LISP。我推荐 Paul Grahams 的文章 The roots of LISP,如果你有时间,你可能想做所有由巫师自己完成的 video lectures of SICP。对于更常见的 Lisp 方法,您可能对 Land of Lisp 感兴趣。

【讨论】:

  • 实现 MLISP 或 RLISP,两者都没有前缀表示法,已经是一个开始。例如,计算机代数系统 REDUCE 是用 RLISP 编写的。
猜你喜欢
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
相关资源
最近更新 更多