2014-10-03 27 views
3

我對Lisp非常陌生,並且正在嘗試編寫一個程序,該程序只是要求用戶輸入3個數字,然後對它們進行求和並打印輸出。如何在Lisp中讀取用戶輸入

我讀過,你可以在你的功能,如:

(defvar a) 

(setq a (read)) 

設置在Lisp的變量,但是當我嘗試編譯使用我的代碼LispWorks我得到以下錯誤:

End of file while reading stream #<Concatenated Stream, Streams =()>

我覺得這應該是比較簡單的,不知道我哪裏出錯了。

+3

如果我們看不到您的代碼,我們很難幫助您。 – 2014-10-03 01:11:09

回答

4

我還沒有與LispWorks合作過,所以這只是一個猜測。

當編譯器遍歷代碼時,它會到達(setq a (read))行,它會嘗試讀取輸入,但編譯時沒有輸入流,因此會出現錯誤。

寫一個函數:

(defvar a) 

(defun my-function() 
    (setq a (read)) 

它應該工作。

2

這應該在你的Lisp的正確評估:在您的LispWorks解釋

(read-3-numbers-&-format-sum) 

(defun read-3-numbers-&-format-sum() 
    (flet ((prompt (string) 
      (format t "~&~a: " string) 
      (read nil 'eof nil))) 
    (let ((x (prompt "first number")) 
      (y (prompt "second number")) 
      (z (prompt "third number"))) 
     (format t "~&the sum of ~a, ~a, & ~a is:~%~%~a~%" 
       x y z (+ x y z))))) 

簡單地評價以上函數的定義,然後運行形式。

+0

你會注意到我沒有在全局範圍上用SETQ或DEFVAR等特殊形式設置任何變量。總之,這將是糟糕的編程。如果任何人都感興趣,我會很高興寫下這段代碼的演練。 – miercoledi 2014-10-03 18:52:08

+1

更改特殊變量的值本身並不是「糟糕的編程」。狀態在很多應用中都是必需的,在OP的情況下,狀態並不壞,因爲他的程序只是一個測試。 – Mark 2014-10-04 03:28:22

+0

我不知道你的意思是'特殊變量',但我認爲你可能會對我使用術語_special form_這個術語感到困惑,這個術語被高級lisp黑客用來引用諸如那些利用SETF的僞造函數代表所有這些特殊形式和功能區域構成了任何給定的口語方言的最高水平。這種形式的語法通常類似於'(函數something-weird arguments)',即不能將SETF重寫爲一個函數,因爲除其他原因外,它將_symbol-name_作爲其第一個僞參數。 – miercoledi 2014-10-10 02:25:55