Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 需要lisp概念和术语帮助_Common Lisp_Conceptual - Fatal编程技术网

Common lisp 需要lisp概念和术语帮助

Common lisp 需要lisp概念和术语帮助,common-lisp,conceptual,Common Lisp,Conceptual,我在网上搜索了答案,但运气不好,所以如果这是一个重复的问题,请原谅我。我将陈述我的问题:=(?)因此,在下面代码中的注释中也是如此。(我将Emacs与clisp和Slime一起使用): 我可以看到链接这些“部分应用程序”的好处,但这本身并不可行,对吗(?)好吧,让我们检查一下我的观察是否正确: ;; the 'let statement *binds* 'loc to the 'clos object with 10 being the argument ;; for the f

我在网上搜索了答案,但运气不好,所以如果这是一个重复的问题,请原谅我。我将陈述我的问题:=(?)因此,在下面代码中的注释中也是如此。(我将Emacs与clisp和Slime一起使用):

我可以看到链接这些“部分应用程序”的好处,但这本身并不可行,对吗(?)好吧,让我们检查一下我的观察是否正确:

    ;; the 'let statement *binds* 'loc to the 'clos object with 10 being the argument
    ;; for the formal parameter x. when funcall is applied to 'loc with 20 for y, the
    ;; lambda expression substitutions are complete and 200 is returned(?). 

    (defun close(x)
        (lambda(y)(* x y)))
    ->CLOSE
    (let ((loc (close 10)))
        (funcall loc 20))
    ->200

上面的代码是一个闭包(?),因为“let”语句中的“loc”的作用域:如果“clos”是一个可变变量,它只会在“let”语句(?)内更改值。。。我想。最后,如果有人能告诉我如何让宏更好地使用上述函数,那将非常有帮助,(它们会立即求值…)谢谢。

第一个示例可以称为嵌套函数和部分求值。但下一个例子更为惯用。这两种方法都可以称为手工咖喱,尽管通常咖喱被理解为一种自动过程。您可以像这样在Lisp中使用currying(一种变体):

谈到闭包问题:
let
下的
funcall
不是闭包-闭包是
let
中的函数定义。实际上,您的第一个示例是闭包,因为您在另一个函数中定义了一个函数,每个函数都引入了类似于
let
绑定的内容

然而,在您的案例中,一个更典型的例子是:

(let ((z 10))
  (defun close (x)
    (* x z))
->CLOSE
(close 20)
->200

这里,
z
是在闭包中捕获的变量。

第一个示例既不是嵌套函数也不是部分应用程序。相反,每次调用外部函数时,它都会计算内部的
defun
,重新定义全局可见的
add函数。我不认为这种模式有什么特别的名字

CommonLisp确实有词汇范围的嵌套函数,这些函数带有
flet
标签
表单

在第二个示例中,函数
close
返回一个闭包(一个函数值,它引用在该函数体外部词汇绑定的变量)。您对该返回值所做的操作不会影响它是什么类型的值

步骤
在SBCL中将非常无用,除非您要求提供额外的调试信息。通过将此表单放在函数之前执行此操作:

(proclaim '(optimize (debug 3)))

很抱歉,响应太晚,硬件故障和宠物生病让我很忙。我有点被我得到的回答弄糊涂了,所以我花了最后一个小时来解读斯蒂尔先生和塞贝尔先生对绑定表单和闭包的看法。我现在对自己的理解和术语更有信心。我稍后会写一个一般性的回复。
(let ((z 10))
  (defun close (x)
    (* x z))
->CLOSE
(close 20)
->200
(proclaim '(optimize (debug 3)))