1

我有一个程序需要具有一系列可互换的功能。

在 c++ 中,我可以做一个简单的typedef陈述。然后我可以调用该列表中的一个函数function[variable]。如何在 Common Lisp 中做到这一点?

4

3 回答 3

4

在 Common Lisp中,一切都是对象值,包括函数。(lambda (x) (* x x))返回一个函数值。该值是函数所在的地址或类似的地址,因此只需将其放在列表、向量 og 哈希中,您就可以获取该值并调用它。这是一个使用列表的示例:

;; this creates a normal function in the function namespace in the current package
(defun sub (a b)
  (- a b))

;; this creates a function object bound to a variable
(defparameter *hyp* (lambda (a b) (sqrt (+ (* a a) (* b b)))))

;; this creates a lookup list of functions to call
(defparameter *funs* 
  (list (function +) ; a standard function object can be fetched by name with function
        #'sub        ; same as function, just shorter syntax
        *hyp*))      ; variable *hyp* evaluates to a function

;; call one of the functions (*hyp*)
(funcall (third *funs*) 
         3
         4)
; ==> 5

;; map over all the functions in the list with `3` and `4` as arguments
(mapcar (lambda (fun)
          (funcall fun 3 4))
        *funs*)
; ==> (7 -1 5)
于 2019-07-19T21:58:52.413 回答
2

已经提供了大量代码的答案,我想补充一点理论。语言之间的一个重要区别是它们是否将功能视为一等公民。当它们这样做时,据说它们支持一流的功能。Common Lisp,C 和 C++没有。因此,Common Lisp 在函数的使用上比 C/C++ 提供了更大的自由度。特别是(参见代码的其他答案),在 Common Lisp 中(通过lambda-expressions)创建函数数组的方式与任何其他对象的数组非常相似。至于 Common Lisp 中的“指针”,你可能想看看这里这里了解如何使用 Common Lisp 方式完成工作。

于 2019-07-20T19:20:18.903 回答
2

一个函数向量,我们取一个并调用它:

CL-USER 1 > (funcall (aref (vector (lambda (x) (+ x 42))
                                   (lambda (x) (* x 42))
                                   (lambda (x) (expt x 42)))
                           1)
                     24)
1008
于 2019-07-20T16:14:15.297 回答