2014-11-29 4 views
0

내 프로그램에서 표현식을 요구하고 입력 된 문자열을 변수 'exp'에 할당 한 다음 표현식을 인쇄하길 원합니다.입력 문자열을 할당하고 변수에 인쇄하십시오. Lisp

그러나 몇 가지 문제가 있습니다. 나는 처음으로 (읽기)를 사용하여 시도했다.

(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 
+0

'exp'는 선언되지 않은 것입니다. Common Lisp에서 변수를 선언해야합니다. –

+0

어떻게 선언합니까? 나는 그것이 자동적으로 선언 된 줄 알았다. – sam

+0

'LET','LET *','DEFUN','LAMBDA','DEFVAR','DEFPARAMETER' ... –

답변

4

발생합니다.

출력을 버퍼링 할 수 있습니다. FINISH-OUTPUT을 사용하여 출력이 실제로 목적지에 도달했는지 확인하십시오.

READ은 Lisp s-expressions을 읽습니다. 해당 데이터 구조를 반환합니다. 유효한 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 
+0

두번째 코드에서 무엇이 잘못 되었기 때문에 read를 사용할 때 아무것도 읽지 않습니다. -선 ? 그냥 아무 것도 읽지 않는 것처럼 보이고 사용자가 아무 것도 입력하지 않을 때까지 기다리 지 마십시오. – sam

+0

@sam : 출력이 인쇄되는지 확인하십시오. 결선 - 출력을 사용하십시오. 입력 스트림에 보류중인 입력이 있으면 READ-LINE이 해당 입력을 읽고 즉시 반환합니다. –

+0

잘하고 있는지 잘 모르겠지만 마무리 출력을 사용해 보았지만 제대로 사용하고 있는지 알지 못합니다. 어떻게해야할까요? 내 프로그램에도 똑같은 문제가 있습니다. – sam

관련 문제