【问题标题】:Common Lisp - Using a function as input to another functionCommon Lisp - 使用一个函数作为另一个函数的输入
【发布时间】:2011-04-11 17:59:21
【问题描述】:

假设我有一个接受列表并执行某些操作的函数:

(defun foo(aList)
   (loop for element in aList ...))

但是如果列表是嵌套的,我想在循环执行操作之前先将其展平,所以我想使用另一个展平任何列表的函数 (defun flatten(aList)):

(defun foo(flatten(aList))
   (loop for element in aList ...))

Lisp 不喜欢这样。还有其他直接的方法吗?

【问题讨论】:

    标签: function lisp common-lisp


    【解决方案1】:

    这是一种方法:

    (defun foo (alist)
      (loop for element in (flatten alist) ...)
    

    【讨论】:

      【解决方案2】:

      您可以将函数作为&optional 参数传递。

      (defun foo (alist &optional fn)
        (if (not (null fn))
            (setf alist (funcall fn alist)))
        (dostuff alist))
      

      dostuff 仅打印其参数的示例运行:

      (foo '(1 2 (3)))
      => (1 2 (3))
      (foo '(1 2 (3)) #'flatten)
      => (1 2 3)
      

      这种方法更加灵活,因为您不仅仅局限于一个“预处理器”功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-07
        • 2011-05-27
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 2022-01-04
        • 1970-01-01
        相关资源
        最近更新 更多