2013-09-27 4 views
1

Например, я хочу, чтобы определить такую ​​функцию:Как передать арифметические операторы в качестве параметров функции в LISP?

(defun operation (op) 
    (op 3 7)) 

Но шепелявость компилятор жалуется на такой код: (operation +)

Есть ли способ передать арифметический оператор в качестве параметров функции?

+0

возможно дубликат [? Как я могу использовать функцию в качестве переменной в шепелявостью] (http://stackoverflow.com/questions/6882502/how-do -i-use-a-function-as-a-variable-in-lisp) –

+0

(Это на самом деле не большой дубликат, но лучший ответ на этот вопрос был бы хорошим ответом на этот вопрос.) –

ответ

3

Существует две категории диалектов Лиспа: Лисп-1 и Лисп-2. Lisp-1 означает, что функции и переменные совместно используют одно пространство имен. Схема - Lisp-1. Lisp-2 означает, что функции и переменные имеют разные пространства имен. Common Lisp - это Lisp-2. Если вы хотите передать функцию с именем a в качестве аргумента другой функции, вы должны указать ее как #'a. Если у вас есть функция, хранящаяся в переменной, вы можете использовать функцию apply для ее выполнения. You код должен работать, если он переписывается так:

(defun operation (op) 
    (apply op '(3 7))) 

(operation #'+) 
+3

Существует также «funcall 'функция, подобная' apply', но с аргументами, расширенными вместо собранных в список, поэтому '(apply op '(3 7))' также может быть записано как '(funcall op 3 7)'. –

+2

Подробнее о том, когда использовать, см. [Когда вы используете APPLY и FUNCALL?] (Http://stackoverflow.com/q/3862394/1281433) –

Смежные вопросы