2019년 1월 9일 수요일

[on lisp] 4.7 Symbols and Strings 심볼과 문자열 사이

4.7 Symbols and Strings
심볼과 문자열은 밀접한 관련이 있다.

reading,printing 함수에 따라 우리는 두 표현을 왔다갔다 할 수 있다.
Figure 4.8은 이 경계에서 작동하는 유틸리티 함수의 예를 보여준다.
;; Figure 4.8: Functions which operate on symbols and strings.
(defun mkstr (&rest args)
  (with-output-to-string (s)
    (dolist (a args) (princ a s))))

(defun symb (&rest args)
  (values (intern (apply #'mkstr args))))

(defun reread (&rest args)
  (values (read-from-string (apply #'mkstr args))))

(defun explode (sym)
  (map 'list #'(lambda (c)
           (intern (make-string 1
                   :initial-element c)))
             (symbol-name sym)))
첫번째 mkstr 함수는 많은 수의 인수를 취하여 출력된 표현을 문자열로 묶는다.
> (mkstr pi " pieces of " 'pi)
"3.1415926535897932385L0 peices of PI"
출력가능한 표현을 할 수 있는 아무 객체가 가능하다. : symbols, strings, numbers even lists
> (mkstr pi " pieces of " 'pi)
> (symb 'ar "Madi" #\L #\L 0)
|ARMadiLL0|
mkstr로 모든 인수들을 묶으라고 한 후, symb는 그 결과 문자열을 intern에게 보낸다.
intern 함수는 Lisp의 전통적인 기호제작자(symbol-builder): 문자열을 받아 그 문자열을 인쇄하는 심볼을 찾거나 새로운 심볼을 생성한다.

모든 문자열은 심볼의 출력이름(print-name)이 될 수 있으며, 심지어 소문자나 매크로 문자(괄호)같은 것들도 포함된다.
심볼이름이 이런 기괴한 것들이 포함되어 있을 경우, 아래와 같이 수직 막대 내에서 출력된다.
> (let ((s (symb '(a b))))
(and (eq s '|(A B)|) (eq s '\(A\ B\))))
T

reread는 symb의 일반화이다. 여러 객체를 한번에 받아 출력하고 다시 읽는다.
symb와 같이 심볼을 리턴할 수 있지만 읽을 수 있는 다른 무언가를 리턴할 수도 있다.

Read-macro는 심볼의 이름의 일부로 취급되는 대신, (예를들어)|a:b|를 보면 현재 패키지 안에 |a:b|라는 심볼을 찾는 것이 아니라.
|a:b|는 a 패키지 안에 b라고 읽어진다. 또한 보다 일반적인 함수는 더 까다롭다. 'reread'는 해당 Lisp구분이 적절하지 않으면 에러를 생성한다.

마지막 함수 explode는 함수를 받아서 심볼 리스트를 반환한다.
> (explode 'bomb)
(B O M B)

댓글 없음:

댓글 쓰기