我在网上搜索过答案,但运气不佳,所以如果这是一个重复的问题,请原谅我。我将陈述我的questions:= (?)因此,以及在下面代码中的注释中。(我使用的是Emacs,带有clisp和Slime):
;; is this called nested function or partial application or what(?)
(defun create-function(a)
(defun add-function(x)(+ x a)))
->(create-function 8)
->ADD-FUNCTION
->(add-function 3)
->11我可以看到链接这些“部分应用程序”的好处,但这本身并不是赛跑,对吗(?)好吧,让我们来看看我的观察是否正确:
;; 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语句(?)中更改值。最后,如果有人能告诉我如何让步骤宏与上述函数保持良好关系,这将非常有帮助,(他们立即……)谢谢。
发布于 2014-01-20 05:43:47
第一个例子既可以称为嵌套函数,也可以称为部分计算。但下一个例子是更地道的。这两者都可以称为手动赛跑,虽然通常理解为自动过程。您可以在Lisp中使用以下运行方式(一个变体):
(defun curry (function &rest arguments)
(lambda (&rest more)
(multiple-value-call function
(values-list arguments) (values-list more))))谈到闭包问题:funcall在let下不是闭包-闭包是let中的函数定义。实际上,第一个例子是闭包,因为您在另一个函数中定义了一个函数,每个函数都引入了类似于let绑定的内容。
然而,在您的情况下,一个更典型的例子是:
(let ((z 10))
(defun close (x)
(* x z))
->CLOSE
(close 20)
->200在这里,z是在闭包中捕获的变量。
发布于 2014-01-20 06:11:36
第一个例子既不是嵌套函数,也不是部分应用程序。相反,它评估内部defun,每次调用外部函数时重新定义全局可见的add-function。我不认为那种模式有什么特别的名字。
普通的Lisp确实具有具有flet和labels表单的词汇作用域嵌套函数。
在第二个示例中,函数close返回一个闭包(一个函数值,它引用在该函数主体之外的词汇绑定变量)。您对返回值所做的操作并不会影响返回值的类型。
除非您需要额外的调试信息,否则step在SBCL中将是非常无用的。为此,请将此表格放在函数前面:
(proclaim '(optimize (debug 3)))https://stackoverflow.com/questions/21223784
复制相似问题