학부공부/인공지능

LISP 에서의 입력과 출력

IT grow. 2018. 10. 3. 15:24
반응형

LISP에서의 입력 , 출력

 




입출력 작용은 입출력 ( I / O )함수에 의해서 수행된다 .

I/O함수에는 read , print , prinl , print , terpri , format등이 있다.


Read : 인수를 취하지 않는다 , 키보드로부터 입력될 때까지 수행이 잠시 중단된다.


Ex ) ( + 5 (read))

6

è  11

 

인터프리터는 +함수를 발견하고서 , 수행하기 위해 인수를 찾는다 . 그러다가 read를 발견하고나서 잠시 중단이 된다 . 사용자가 6를 입력하게 되면 , read6을 인지하고 +함수를 수행한다 . 결론적으로 11이 반환이 되는 것이다.

 

Print : 하나의 인수를 취한다 . 인수를 받아들인 그대로 프린트하고 동시에 그 인수를 되돌려 준다 . 이것은 어떤 것을 프린트 함과 동시에 그것을 다른 함수에 인수로 제공하는 방식으로 수행이 된다 .

Ex) (print ‘(a b c))

è  ( A B C )

è  ( A B C )

(print “hello there”)

è  “hello there”

è  “hello there”

 

처음의 출력은 print가 그 인수를 프린트하고 리턴한 값이며 , 이 값은 다시 read-evaluate-print 루프로 보내져 프린트 되는데 , 그 값이 또 화면에 출력되기 때문이다 . 그리고 (“) 겹따옴표까지 인쇄한다는 것을 확인할 수 있음

 

 

Prinl :


Ex) ((prinl ‘(hello))(prinl ‘(hello)))

è  (HELLO)(HELLO)

개행문자와 빈칸이 제공되지 않는 것을 제외하고는 print와 똑같다

개행문자는 줄바꿈이다

 

Princ : 출력에서 겹따옴표가 표시되는 것을 피할 수 있다. 겹따옴표를 프린트하지 않는 것을 제외하고는 prinl과 똑같다.

Ex) (princ “hello there”)

è  hello there “hello there”

 

princ가 따옴표를 없애 주기는 하지만 , 여전히 똑 같은 문장이 반복되는 것 ( echo ) 문은 남아있다. 그 이유는 princ가 그 인수값을 되돌려 주고 , 그것이 마지막 문장이 였기 때문에 read-evaluate-print 루프에 의해서 또 프린트 되었기 때문이다. 아마 이것이 익숙치 않을 것인데 , 일반적인 프로그램에서 리턴값은 보통 그것이 다른 함수에 의해서 사용 or 흡수되기 때문에 화면에 출력되지 않는 것이다.

 

Terpri : 인수는 취하지 않는다 . 그것이 나타나는 곳에는 항상 새로운 라인이 생기며 , nil값을 되돌려 준다.

 

Ex) (defun circle-area( )

      (terpri)

      (princ “ please enter the radius : “)

      (setq radius (read))

      (princ “ the area of the circle is :”)

      (princ (* 3.1416 radius radius))

      (terpri))

CIRCLE-AREA

è  (circle-area)

Please enter the radius : 4

The area of the circle is : 50.2656

 


우리는 이 결과를 통해서 princ 는 같은 라인에 여러 항목 (item)들을 출력하고 terpri는 새로운 라인을 생성한다는 것을 알 수 있다.

 

Format 함수 :

형태 : (format <destination> < string > arg1 arg2 … )이다.

여기서 <destination> 은 출력되는 곳 , 즉 모니터인지 , 외부 파일인지를 표시하는 것이다 .

T 는 디폴트 출력 ( default output ) 으로서 모니터를 뜻한다 .

< string > 은 출력될 문자열인데 , 각 인수들이 정확하게 어떻게 출력되어야 하는지를 뜻하는 포맷지시어들도 포함하고 있다.

포맷지시어들은 문자열내에서 인수들이 출력되는 순서와 동일한 순서로 나타난다.

각 지시어들은 그 것이 지시어임을 표시하는 기호로 틸드(tilde)문자 (~)를 항상 각 지시어 앞에 붙여준다 . 대표적인 포맷지시어들은 다음과 같다.

~A : princ가 사용된 것과 같이 인수가 출력된다.

~S : prinl이 사용된 것과 같이 인수가 출력된다.

~D : 정수인 인수가 10진수로 출력된다.

~F : 실수인 인수가 10진수 실수로 출력된다.

~C : 인수가 문자 출력으로 인쇄된다.

~% : 새로운 줄 ( new – line ) 이 출력된다.

 

인수값의 출력폭은 “~” 부호 바로 다음에 오는 정수로써 표시된다.


Ex)

(format t “Circle radius = ~2F~%Circle area = ~3F” x y)

“Circle radius = 3.0

Circle area = 9.42”

 

사용자의 값에 따른 x y 값을 2F , 3F 를 취해 줌으로써 formatting을 해준다 .

사용자가 x , y에 각각 실수 3.09.42를 저장하였다고 가정하였을 시에 위에와 같은 값을 얻을 수 있다 .


반응형