首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用特殊运算符/表单在通用Lisp中实现"+“

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

Stack Overflow用户
提问于 2018-05-01 17:30:16
回答 5查看 829关注 0票数 3

李斯特 (第9页)中,人们可以找到以下声明:

函数是Lisp程序的构建块。它们也是Lisp的基石。在大多数语言中,+运算符与用户定义的函数非常不同。但是Lisp有一个单一的模型,函数应用程序,用来描述一个程序所做的所有计算。Lisp +运算符是一个函数,就像您可以定义自己的函数一样。事实上,除了少数名为特殊表单的操作符外,Lisp的核心是Lisp函数的集合。有什么能阻止你加入这个收藏呢?什么都没有:如果你想让Lisp做些什么,你可以自己写,你的新函数就会像内置函数一样被对待。

我的问题是,如何使用以下特殊运算符来实现类似于+运算符的操作?或者,是否有更多的运营商被使用,而格雷厄姆只是不精确和戏剧性?

代码语言:javascript
复制
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    

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-05-01 17:44:50

他并不是说每个函数都是用这些特殊的形式来实现的。

他说+ (和其他所有函数一样)是一个函数

  • 可以使用普通语法(+ x y z) (其中+是函数,xyz参数)调用它。
  • 将首先计算参数:(f (g) (h))在调用f之前将同时调用gh,即使f恰好是+
  • 您可以像任何其他函数一样传递它,并通过funcallapply调用它:(let ((x #'+)) (funcall x 1 2 3))是6。

要点是,这些属性不一定适用于特殊形式。if并不是首先计算它的所有参数;您不能引用let并间接调用它;等等。

当然,这仍然为“编译器魔法”打开了大门。在某些时候,+必须执行低级别的操作,这取决于数字是如何实现的。根据Lisp编译器的不同,细节看起来会有所不同。

票数 6
EN

Stack Overflow用户

发布于 2018-05-01 17:58:19

cl:+的行为就像一个函数,并且被当作一个函数来对待。

您不必自己定义它,也不必只使用其他已经定义的CL标准操作符来定义它。cl:+的定义很可能使用特定于实现的内部功能。

通用Lisp有三种类型的操作符:函数、宏和特殊操作符。

该标准并没有详细说明它们是如何实现的。有理由相信,Common实现将有更多的内部操作符用于实现标准操作。

  • 虽然CL实现可以提供额外的特殊操作符,但特殊运算符的数量是固定的。特殊操作符不是函数,用户无法定义特殊运算符。
  • CL定义了一系列标准宏和用户定义新宏的方法。未指定标准宏的定义方式。
  • CL为用户定义了一系列标准函数和定义新函数的方法。未指定标准函数的定义方式。
票数 4
EN

Stack Overflow用户

发布于 2018-05-01 17:44:01

以下是src/code/ source s.lisp中sbcl的源代码

代码语言:javascript
复制
(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."))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50121024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档