2014-10-03 28 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