在李斯特 (第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 有办法查看这些函数的源代码吗?
发布于 2018-05-01 17:44:50
他并不是说每个函数都是用这些特殊的形式来实现的。
他说+ (和其他所有函数一样)是一个函数
(+ x y z) (其中+是函数,x、y、z参数)调用它。(f (g) (h))在调用f之前将同时调用g和h,即使f恰好是+。funcall和apply调用它:(let ((x #'+)) (funcall x 1 2 3))是6。要点是,这些属性不一定适用于特殊形式。if并不是首先计算它的所有参数;您不能引用let并间接调用它;等等。
当然,这仍然为“编译器魔法”打开了大门。在某些时候,+必须执行低级别的操作,这取决于数字是如何实现的。根据Lisp编译器的不同,细节看起来会有所不同。
发布于 2018-05-01 17:58:19
cl:+的行为就像一个函数,并且被当作一个函数来对待。
您不必自己定义它,也不必只使用其他已经定义的CL标准操作符来定义它。cl:+的定义很可能使用特定于实现的内部功能。
通用Lisp有三种类型的操作符:函数、宏和特殊操作符。
该标准并没有详细说明它们是如何实现的。有理由相信,Common实现将有更多的内部操作符用于实现标准操作。
发布于 2018-05-01 17:44:01
以下是src/code/ source s.lisp中sbcl的源代码
(macrolet ((define-arith (op init doc)
`(defun ,op (&rest numbers)
(declare (explicit-check))
,doc
(if numbers
(let ((result (the number (fast-&rest-nth 0 numbers))))
(do-rest-arg ((n) numbers 1 result)
(setq result (,op result n))))
,init))))
(define-arith + 0
"Return the sum of its arguments. With no args, returns 0.")
(define-arith * 1
"Return the product of its arguments. With no args, returns 1."))https://stackoverflow.com/questions/50121024
复制相似问题