심볼과 문자열은 밀접한 관련이 있다.
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)
댓글 없음:
댓글 쓰기