Common lisp “通用”lisp中的

Common lisp “通用”lisp中的,common-lisp,quote,Common Lisp,Quote,在实用公共Lisp手册的第3章中,有一个类似SQL的select和where函数的示例。以下是它的简化版本: (defun where (x) #'(lambda (item) (> item x))) 它是这样使用的: (remove-if-not (where 2) (list 1 2 3 4)) 在本书的前面部分,我们解释了“sequence”用于表示后面跟一个函数名,而不是一个需要求值的变量。我不明白为什么这里需要它。我尝试在没有它的情况下实现where函数,

在实用公共Lisp手册的第3章中,有一个类似SQL的select和where函数的示例。以下是它的简化版本:

(defun where (x) 
   #'(lambda (item)
     (> item x)))
它是这样使用的:

(remove-if-not (where 2) (list 1 2 3 4))
在本书的前面部分,我们解释了“sequence”用于表示后面跟一个函数名,而不是一个需要求值的变量。我不明白为什么这里需要它。我尝试在没有它的情况下实现where函数,它也起了作用:

(defun where (x) 
   (lambda (item)
     (> item x)))
我试着在谷歌上搜索它,你可以想象,对于这样一系列的字符,搜索并不是很有成效。我不知道这东西的名字。 在上面的代码中需要它有什么特别的原因吗?

这是处理标准宏字符sharp后跟单引号的精确方法

为了简单起见,此reader宏将展开以将以下形式包含到函数s-expression中。这有效地告诉解析器表单是可调用的

lambda是一个宏,它生成代码,代码已经包含函数,但从历史上看,为了保持一致性,也经常使用另一种形式,即从带有sharp+引号的reader宏中获得的形式

下面是另一个StackOverflow问题,深入讨论了lambda的特殊情况。注意:*对于这些示例,print pretty*为零

(defun where (x) 
  #'(lambda (item)
      (> item x)))
在上面的函数中,您正在创建一个匿名函数,并将其作为闭包返回,函数加上X的变量绑定。由于您将其作为值返回,因此必须编写函数LAMBDA….'拉姆达。。。是一种较短的表示法,但结果相同-使用读取器宏“:

你也可以写:

(defun where (x) 
  (lambda (item)
    (> item x)))
在定义CommonLisp的过程中,添加了它,以便能够编写上述代码。它也与函数lambda相同。。。类型在常见的Lisp语言中,LAMBDA是宏,它扩展为:

CL-USER 75 > '(lambda (foo) (1+ foo))
(LAMBDA (FOO) (1+ FOO))

CL-USER 76 > (macroexpand '(lambda (foo) (1+ foo)))
(FUNCTION (LAMBDA (FOO) (1+ FOO)))
T
因此,LAMBDA是一个宏,当计算器将其视为LAMBDA…,它将表单扩展为函数LAMBDA。。。表单,然后对其进行求值

函数是一种特殊形式,当计算器看到它时,它将返回一个函数对象-在函数lambda foo 1+foo的情况下,它将匿名函数作为对象返回:

CL-USER 77 > (function (lambda (foo) (1+ foo)))
#<anonymous interpreted function 406000761C>

请参阅find with Novely,您可以在Google上的lisp中找到这个问题,具体地说,lambda nil不是宏调用,而是一个函数文本,lambda nil调用一个宏扩展器,该扩展器扩展为“lambda nil”。当我尝试在REPL中运行代码时,得到的结果略有不同。似乎没有被功能所取代。特别是从字符串“lambda foo 1+foo导致”lambda foo 1+foo和宏扩展“lambda foo 1+foo导致”lambda foo 1+foo读取。我在一个框中使用Lisp和Clozure Common Lisp。@Max:当*print pretty*为T时,它会尝试这样打印。将*print pretty*设置为零,然后再试一次…我刚刚检查了,print pretty在CCL中为零。使用setf*print-缩写-QUOTE*NIL。
CL-USER 77 > (function (lambda (foo) (1+ foo)))
#<anonymous interpreted function 406000761C>
CL-USER 78 > (function sin)
#<Function SIN 4110083C6C>