2013-04-15 4 views
1

Я пытаюсь научить себя некоторой LISP, и, хотя я понимаю большую часть этого, у меня проблемы с пониманием функции eval. Я знаю, что он делает это для нас уже и что это нехорошо использовать (так я и слышу), но как я могу сделать функцию, которая просто добавляет?Динамические функции LISP?

До сих пор я пытался/думать

(setf input-prompt "Enter addition epression: ") 
(setf output-prompt "The value is: ") 

(defun prompt-for-input (msg) 
    (format t msg)) 


(defun sum (expression) 
    (format t "Summing ~d and ~d.~%" x y) 
    (+ x y)) 


(defun add() 
    (prompt-for-input input-prompt) 
    (let ((expression (read))) 
     ((sum (expression))) 
    (add))) 

Не совсем уверен, куда идти на это, любая помощь приветствуется.

+0

Что вы пытаетесь сделать? Похоже, вы хотите называть разные функции на основе выражения, которое вы читаете, без использования 'eval'. Это в основном написание небольшого интерпретатора, что и есть в большинстве книг Lisp (Little Schemer и т. Д.). Но это поможет, если вы сможете более четко описать свою проблему. –

ответ

2
(setf input-prompt "Enter addition expression: ") 
(setf output-prompt "The value is: ") 

(defun prompt-for-input (msg) 
    (format t msg) 
    (finish-output)) 

(defun sum (expression) 
    (let ((x (second expression)) 
     (y (third expression))) 
    (format t "~%Summing ~d and ~d.~%" x y) 
    (+ x y))) 

(defun add() 
    (prompt-for-input input-prompt) 
    (sum (read))) 

Выполнить это:

CL-USER > (add) 
Enter addition expression: (+ 1 2) 
Summing 1 and 2. 
3 
+0

Как LISP пытается выяснить, что такое «второе» и «третье» выражение? – Nogg

+0

'(Второе выражение)' является вторым элементом списка 'expression'. – Svante

+0

Код, похоже, не работает после компиляции. – Nogg