0

我希望我的程序请求一个表达式,将输入的字符串分配给变量“exp”,然后打印该表达式。

但是我遇到了一些麻烦。我第一次尝试使用(阅读)

(princ "Enter a expression to be evaluated.")
(setf exp (read))
(princ exp)

但是,当我使用此代码时,会发生这种情况。

Hello this is an expression            ;This is what I input
Enter a expression to be evaluated.HELLO
T

然后我尝试使用 (read-line),但是当我这样做时,我似乎根本没有被要求输入。

(princ "Enter a expression to be evaluated.")
(setf exp (read-line))
(princ exp)

得到

Enter a expression to be evaluated.
T

节目刚刚结束。

在一些答案之后,我想出了这个

(defun get-input (prompt)
  (clear-input)                     
  (write-string prompt)             
  (finish-output)                   
  (setf exp (read-line)))           

(get-input "Enter an expression: ")
(princ exp)

但是,当我运行此程序时,会发生以下情况

My first sentence                            ;My first input
Enter an expression: My second sentence      ;it then asks for input, i do so
My second sentence                           ;my second input is printed back at me
T
4

1 回答 1

4

这是一种常见问题解答。

输出可以被缓冲。用于FINISH-OUTPUT确保输出已实际到达其目的地。

READ读取 Lisp s 表达式。它返回相应的数据结构。仅当您输入有效的 s 表达式时才有用。

READ-LINE读取一行并返回一个字符串。

例子:

* 
(defun ask (&optional (message "Input: "))
  (clear-input)           ; get rid of pending input
  (write-string message)  ;
  (finish-output)         ; make sure output gets visible
  (read-line))            ; read a line as a string

ASK
* (ask "Name: ")
Name: Rainer

"Rainer"
NIL

文件p.lisp

(defun get-input (prompt)
  (clear-input)
  (write-string prompt)
  (finish-output)
  (read-line))

(write-string (get-input "Enter a sentence: "))
(finish-output)

输出

* (load "/tmp/p.lisp")
Enter a sentence: foo is not a bar
foo is not a bar
T
于 2014-11-29T15:54:27.890 回答