我有一个程序,需要具有一系列可互换的功能。
在c ++中,我可以做一个简单的typedef
语句。然后,我可以使用function[variable]
调用该列表中的函数。如何在Common Lisp中做到这一点?
答案 0 :(得分:4)
在Common Lisp中,一切是一个对象值,包括函数。 (lambda (x) (* x x))
返回一个函数值。该值是函数所在的地址或类似地址,因此只要将其包含在列表,向量或哈希中,就可以获取该值并调用它。这是一个使用列表的示例:
;; 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)
答案 1 :(得分:2)
函数向量,我们将其取一个:
CL-USER 1 > (funcall (aref (vector (lambda (x) (+ x 42))
(lambda (x) (* x 42))
(lambda (x) (expt x 42)))
1)
24)
1008
答案 2 :(得分:2)
已经给出的答案提供了大量代码,我想补充一点理论。语言之间的重要区别是它们是否将功能视为first-class citizens。当他们这样做时,据说他们支持first-class functions。 Common Lisp does,C和C ++ don't。因此,在使用函数方面,Common Lisp提供了比C / C ++更大的自由度。特别是(请参见代码的其他答案),它在Common Lisp中创建函数数组(通过lambda-expressions)的方式与其他任何对象的数组相同。至于Common Lisp中的“指针”,您可能想看看here和here来了解Common Lisp方式的完成方式。