如何使用特殊运算符/表单在Common Lisp中实现"+"

Mad*_*ist 3 function common-lisp special-form

On Lisp(第9页)中,可以找到以下声明:

函数是Lisp程序的构建块.它们也是Lisp的构建块.在大多数语言中,+运算符与用户定义的函数完全不同.但Lisp有一个模型,函数应用程序,用于描述程序完成的所有计算.Lisp +运算符是一个函数,就像你自己定义的函数一样.事实上,除少数运算符称为特殊表单外,Lisp的核心是Lisp函数的集合.什么阻止你添加到这个系列?什么都没有:如果你想你想的Lisp可以这样做,你可以把它写自己,和你的新功能将被视为就像内置的.

我的问题是如何+使用以下特殊运算符实现运算符?或者实际上有更多的运营商在使用,格雷厄姆只是不精确和戏剧化?

block      let*                  return-from      
catch      load-time-value       setq             
eval-when  locally               symbol-macrolet  
flet       macrolet              tagbody          
function   multiple-value-call   the              
go         multiple-value-prog1  throw            
if         progn                 unwind-protect   
labels     progv                                  
let        quote    
Run Code Online (Sandbox Code Playgroud)

有没有办法查看这些函数的源代码?

mel*_*ene 6

他并不是说每个功能都是以这些特殊形式实现的.

他说+(像其他所有功能一样)是一个功能:

  • 它可以使用正常的语法可以称为(+ x y z)(其中+是函数和x,y,z的参数).
  • 将首先评估参数:(f (g) (h))将调用两者gh在调用之前f,即使f恰好是+.
  • 你可以通过它周围像任何其他的功能,并通过调用它funcallapply:(let ((x #'+)) (funcall x 1 2 3))6.

关键是这些属性不一定适用于特殊形式.if不首先评估所有论点; 你不能参考let并间接称呼它; 等等

当然,这仍然为"编译魔术"打开了大门.在某些时候+必须执行低级操作,例如取决于数字的实现方式.根据您的Lisp编译器,细节看起来会有所不同.