当前位置:  开发笔记 > 编程语言 > 正文

如何在lisp中本地定义函数?

如何解决《如何在lisp中本地定义函数?》经验,为你挑选了2个好方法。

我需要在let中定义一个函数并能够立即使用它,如下所示:

(let ((test (lambda () (print "ha")))) 
    (test))

但是,由于test是一个变量(而不是函数),因此它不起作用.相反,我需要像这样运行它:

(let ((test (lambda () (print "ha")))) 
    (funcall test))

在我的情况下,这是一个问题.我可以通过制作一个更改(测试)到(funcall测试)的宏来解决这个问题,但是,这不起作用,因为宏的名称将与我的情况中的方法相同(我猜这会导致(测试) )成为(funcall test)=>(funcall(funcall test))=> ......?)

有没有办法在lambda中定义一个方法并立即运行它,而不用像funcall这样的东西?



1> coredump..:

请参见特殊操作员FLET,LABELS,MACROLET .注意之间的差异FLETLABELS.特别是,LABELS可以定义(相互)递归函数,而FLET可以隐藏现有函数,同时能够调用该函数本身:

(defun foo () (flet ((foo () (foo))) (foo)))
       ^1             ^2      ^1      ^2

(defun foo () (labels ((foo () (foo))) (foo)))
       ^1               ^2      ^2      ^2



2> Rainer Joswi..:

我可以通过创建一个更改(测试)到(funcall测试)的宏来解决这个问题,但是,这不起作用

为什么不?

CL-USER 4 > (let ((test (lambda () (print "ha"))))
              (macrolet ((test ()
                           `(funcall test)))
                (test)))

"ha" 
"ha"

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有