如何在defun中定义一个函数?

时间:2010-09-22 18:15:27

标签: lisp common-lisp

例如,我将函数名称传递给另一个函数

(personal-function 'func-name '(attr1 attr2 ...))

我想做的是

(defun personal-function (func-name)
     (defun func-name '(attr1 attr2 ...) (dosomething)))

然而,它说我不能defun带有符号......我该怎么办?

5 个答案:

答案 0 :(得分:4)

使用

(setf (symbol-function my-symbol) some-function)

使用

创建一个新函数
(compile nil (list 'lambda args body))

其中args和body具有有意义的值。

答案 1 :(得分:2)

按如下方式解决:

e.g1

(defun create-function(a1)
  (defun plus-function(x) (+ x a1)))

(create-function 2) -> PLUS-FUNCTION
(plus-function 3) ->5

e.g2

(setf (symbol-function 'printx) #'(lambda (x) (print x)))

(printx '(1 2 3)) -> (1 2 3)

以前我在定义函数时也遇到了同样的问题。

示例:

(defun test-function(fn)
            (defun fn ((lambda() (print "aaa")))))

我跑完后

(test-function 'aaafunction)

评估结果是

FN

它不会返回名为“aaafunction”的函数......

给那些拒绝我的回答的人: 我们是Lisp的新手,但我们正在努力学习知识,而你却不那么尊重。

答案 2 :(得分:1)

你可以使用lambda

http://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial-21.html

如果你试图在函数内部创建一个新的全局可访问函数,我认为语言的语法不允许这样做。如果创建lambda,则可以将变量初始化为此lambda值,并将变量传递给函数。在Common LISP中,您可以在尝试调用变量之前调用(functionp x)来确定变量是否为函数。

答案 3 :(得分:0)

我使用defmacros进行元编程,例如,this emacs lisp示例。

答案 4 :(得分:0)

使用宏将是一个不错的选择。如 (defmacro个人功能(功能名称)      `(defun,func-name'(attr1 attr2 ...)(dosomething))) 请试一试,希望能帮到你。