首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在lisp中将函数用作变量?

如何在lisp中将函数用作变量?
EN

Stack Overflow用户
提问于 2011-07-30 18:16:36
回答 3查看 385关注 0票数 3

我正在尝试编写一个函数来检查列表x中的每个元素是否都有属性a,所以我写道:

代码语言:javascript
复制
(defun check (a x)
  (if (listp x)
    (eval (cons 'and (mapcar #'a x)))))

但它不起作用。(基本上,我希望a是一个函数的名称,比如blablabla,在检查函数的主体中,我希望#'a指的是函数blablabla,而不是一个名为a的函数。)现在上面的代码不起作用了。我认为在Lisp中应该能够插入函数。我怎么才能修复它?

(从字面上讲,这是我使用lisp的第一天,所以这可能是一个愚蠢的问题;)顺便说一句,我正在使用Lispworks6.0个人版。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-30 18:30:52

这里不需要使用尖引号语法。它的目的是在变量位置使用函数名,但是a已经是一个变量了。只需编写a而不是#'a

票数 6
EN

Stack Overflow用户

发布于 2011-07-30 18:28:32

你不需要eval,你可以使用apply。解决问题的方法:您需要funcall,因为您提供了a作为参数。(编辑:在这种情况下不是。)通过引用,您只引用了函数a,而不是此函数中的a。

代码语言:javascript
复制
(defun check (a xs)
  (if (listp xs)
      (every #'identity (mapcar a
                                xs))))

更好的做法是使用loop

代码语言:javascript
复制
(defun check (a xs)
  (if (listp xs)
      (loop for x in xs
            always (funcall a x))))

最好,使用every

代码语言:javascript
复制
(defun check (a xs)
   (if (listp xs)
     (every a xs)))
票数 3
EN

Stack Overflow用户

发布于 2011-07-30 18:42:54

下面是我如何编写类似于您的check函数的代码。我试着给它起一个更具描述性的名字。

代码语言:javascript
复制
(defun are-all-elements-fullfilling-fun-p (fun ls)
  (every #'identity (mapcar fun ls)))

编辑:请注意,更短更好的定义是

代码语言:javascript
复制
(defun are-all-elements-fullfilling-fun-p (fun ls)
      (every fun ls)))

现在假设我们想用这个函数来调用它。请注意,我倾向于在可能的情况下使用声明。我经常搞砸一些事情,如果编译器能找出错误,调试就会很容易。同时,代码也会运行得更快。

代码语言:javascript
复制
(defun is-even-p (n)
  (declare (type number n))
  (the boolean (= 0 (mod n 2))))

你必须把#‘放在这里:

代码语言:javascript
复制
(are-all-elements-fullfilling-fun-p #'is-even-p '(1 2 3 4))
(are-all-elements-fullfilling-fun-p #'is-even-p '(38 2 4))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6882502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档