Wisp:用C ++编写的轻量级Lisp

2020-12-28 22:47:48

Lisp是人们真正习惯于使用的那些利基,优美的语言之一

答案很简单:我对隔离感到无聊。如果您想找出为什么这种特殊的口吻特别特别,那么您将一无是处。

像其他所有lisp一样,该语言将s表达式用于代码语法和数据语法。因此,例如,s表达式(打印5)既是有效的代码段,又是包含列表print和5的有效列表。

解释器评估数据(打印5)时,将评估打印5,然后将打印应用于5。

太酷了!但是,如果我们想定义自己的功能呢?我们可以使用内置函数defun!

;定义一个接受参数n的函数fact(defun fact(n)(if(< = n 1)1(* n(fact(-n 1)))))

棒极了!但是您注意到defun功能有什么不同吗?它不会评估其参数。如果对原子事实进行了评估,它将引发如下错误:

>>> facterror:表达式“ fact”在范围{}中失败,消息" atom未定义"

这被称为特殊形式,其中某些功能" quote"他们的论点。我们也可以自己引用事物,但是语言会自动引用特殊形式的参数。

;引用s表达式(1 2 3),以便不对其进行评估。 (打印'(1 2 3))(1 2 3)=> (1 2 3)

如您所见,引用使评估无效。例如,每当对表达式' a求值时,它就变为' a。当您想编写较长的数据或变量名列表而不希望将它们作为代码求值时,这将很有用。

如果仅评估其cond参数。如果cond为真(非零),则评估a。否则,将评估b。

do会获取s表达式的列表,并按照给出的顺序对其进行评估(在当前作用域中),然后返回上一个s表达式的结果。

scope接受s表达式的列表,并按照在新范围中给出的顺序对其进行求值,然后返回上一个s表达式的结果。

define评估value参数,然后将其分配给当前作用域中的name。

for遍历在x中存储每个元素的列表,然后评估for正文中的所有其余值。然后返回最后评估的值。

while在运行之前的每次迭代都会评估其条件表达式。如果为真,它将继续评估while主体中的每个表达式。然后返回最后评估的值。

; quicksort(defun qs(l)(if(< =(len l)1)l(do(定义枢轴(前l)))(+(qs(过滤器(lambda(n)(>枢轴n))l) )(列表枢纽)(qs(尾(过滤器(λ(n)(< =枢纽n))l))))))递减数字(defun dec(n)(-n 1));增加一个数字(defun inc(n)(+ n 1));不是bool(defun not(x)(if x 0 1));对数字求反(defun neg(n)(-0 n));是一个正数吗?(defun is-pos?(n)(> n 0));数字是负数吗?(defun is-neg((n)(< n 0)))

使用您选择的C ++编译器进行编译。自ANSI C ++以来,它与C ++的所有标准版本兼容。