【问题标题】:How to defun a function within a defun?如何在 defun 中定义函数?
【发布时间】:2010-09-22 18:15:27
【问题描述】:

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

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

而我想做的是

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

但是,它说我不能用符号defun... 我该怎么办?

【问题讨论】:

  • defun 不计算名称、参数列表或正文。都必须是文字值。所以你的代码有两个问题。 1) 它将定义一个函数 func-name。 2) 引用的 arglist 也不会像您期望的那样。

标签: lisp common-lisp


【解决方案1】:

使用

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

创建一个新函数

(compile nil (list 'lambda args body))

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

【讨论】:

  • 无法理解:使用什么,setf 或编译,或两者的某种组合(它看起来像什么?)。您实际上并没有本着原始帖子中的示例精神在其他函数定义中提供函数定义示例。
  • @Artem Pelenitsyn:我会先创建函数对象,然后给它设置符号函数。
【解决方案2】:

如下解决:

例如1

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

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

例如2

(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 的新手,但是我们在努力学习知识,而你并不那么尊重。

【讨论】:

  • defun 返回函数名,而不是函数:cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…
  • defun 不计算名称
  • 那么我该如何强制它评估这个“fn”呢?
  • 我猜投反对票是因为答案并没有真正有用——它没有回答问题。感谢您的学习努力,但这并不是您在这里投票的原因。这不是论坛。
  • 所以现在我已经给出了解决方案,应该取消downvote吧?但是你知道吗,那些投反对票的人不会再访问这个问题了。
【解决方案3】:

你可以使用 lambda

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

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

【讨论】:

  • 非常感谢。但是,我的解释器告诉我定义不是函数...? “错误:尝试调用未定义的函数‘DEFINE’。”
  • 您使用的是 Common LISP 吗?方案?
  • functionp的使用见这个lispworks.com/documentation/HyperSpec/Body/f_fnp.htm... lambda和functionp的组合应该做你想做的事。
  • 我不明白你去哪里尝试调用一个名为define的函数。也许它是在我不小心发布的第一个链接中。您是否查看了已编辑问题中的新链接?
  • 哦,我看到了编辑过的!但是您能告诉我如何将 var 初始化为 lambda 值吗?非常感谢!!!!!!
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    使用宏将是一个不错的选择。如 (defmacro 个人函数 (func-name) `(defun ,func-name '(attr1 attr2 ...) (dosomething))) 请尝试一下,希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多