如何在Common Lisp中创建函数指针数组?

时间:2019-07-19 21:09:37

标签: common-lisp ansi-common-lisp

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

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

3 个答案:

答案 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中的“指针”,您可能想看看herehere来了解Common Lisp方式的完成方式。