2014-01-19 69 views
1

我已经搜索了互联网的答案,但没有太多的运气,所以请原谅我,如果这是一个重复的问题。我将陈述我的问题:=(?),然后在下面的代码中的注释中。 (我使用的是CLISP和煤泥的Emacs):(?)lisp概念和术语帮助需要

;; 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 

上面的代码是因为“在禄”让语句的范围封闭(?):如果“克洛斯是一个可变变量也只是改变值,而里面的'让声明(?)...我想。最后,如果有人能告诉我如何让step宏与上述功能搭配使用,那将会有很大帮助,(他们马上评估......)谢谢。

回答

0

第一个示例可以称为嵌套函数和部分评估。但下一个例子更加惯用。两者都可以被称为手动咖喱,但通常咖喱被理解为自动过程。您可以用Lisp使用钻营这样的(一个变体):

(defun curry (function &rest arguments) 
    (lambda (&rest more) 
    (multiple-value-call function 
         (values-list arguments) (values-list more)))) 

谈到关闭问题:funcalllet下不封闭 - 封闭在里面let函数定义。实际上,你的第一个例子是一个闭包,因为你在另一个函数中定义了一个函数,并且每个函数都引入了一个类似于绑定的东西。

然而,在你的情况更为典型的例子是:

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

这里,z处于封闭拍摄的变量。

+0

对不起,迟到的响应,硬件故障和生病的宠物让我非常忙碌。我对我所得到的回应有些困惑,所以我只用了最后一小时就解释了斯蒂尔先生和塞贝尔先生采取的具有约束力的形式和封闭。我现在对我的理解和术语感到更加自信。我稍后会写一个总体回应。 – macrolyte

0

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

Common Lisp具有词汇范围的嵌套函数,其中fletlabels表单具有词汇范围的嵌套函数。

在第二个示例中,函数close返回闭包(一个函数值,指的是在该函数主体外部词法绑定的变量)。你对这个返回值做什么并不影响它是什么样的价值。

step在SBCL中会很没用,除非你要求额外的调试信息。通过在功能之前放置此表单:

(proclaim '(optimize (debug 3)))