2012-02-19 4 views
3

을 내가 노력하고있어취급 매크로 인수 (대소 문자 구분)를

(이것은 모두 더 나은 방법이있을 수 있습니다 내가 상상 너무 간단해야 그것을 것 같다 것들 중 하나입니다) 문자열로 변수 수를 기호로 받아들이는 매크로 (CLISP 용)를 정의합니다 (대소 문자를 구분하는 문자열로 변환됩니다).

(defmacro symbols-to-words (&body body) 
    `(join-words (mapcar #'symbol-name '(,@body)))) 

없이 확장을 단일 상징 체 @

(defmacro symbols-to-words (&body body) 
    `(join-words (mapcar #'symbol-name '(|,@body|)))) 

취급하는 반면, 대문자 심볼 문자열로 변환한다.

아이디어가 있으십니까? 아마 훨씬 쉬운 방법이있을 거라 생각합니다.

답변

6

매크로 이름 확장 이전에 발생하는 판독기 단계 중에 기호 이름이 대문자로 표시되므로 영향을 줄 수있는 매크로로 수행 할 수있는 작업은 없습니다. READTABLE-CASE을 전 세계적으로 설정할 수 있지만 모든 코드에 영향을 미칩니다. 특히 모든 표준 기호를 소스에 대문자로 써야합니다. 표준 라이브러리의 이름에 소문자 버전을 제공하고 독자가 대소 문자 보존되도록 설정하는 CLISP의 '-modern'옵션도 있지만 표준 자체는 아닙니다. 나는 결코 그것을 스스로 사용하지 않았기 때문에 어떤주의 사항이 실제로 적용되는지 확신 할 수 없다.

판독기를 제어하는 ​​다른 방법은 판독기 매크로를 사용하는 것입니다. Common Lisp에는 이미 대소 문자가 구별되는 문자열 인 double quote에 대한 구문을 구현하는 독자 매크로가 있습니다. 왜 당신이 그것을 사용하지 않고 있는지 알지 못해서 더 많은 충고를하는 것은 어렵습니다.

3

Ramarren이 정확하게 말한 것처럼, 기호의 경우는 읽기 시간 동안 결정됩니다. 매크로 확장 시간이 아 U니다. - 수직 막대를 여러 이스케이프 문자를 사용하여

|This is a symbol| :

커먼 리스프는 사건을 변경하지 않고 문자를 지정하는 구문을 가지고있다.

및 백 슬래시도있다 - 하나의 이스케이프 문자 : 읽기 및 보존 읽기 매크로를 사용하여 다른 글로벌 readtable 경우

  • 를 사용

    • :

      CL-USER > 'foo\bar 
      |FOObAR| 
      

      다른 옵션은이 경우

    • 자체 판독기를 사용하는 읽기 매크로 사용

    |,@body| (본문이 접합 된 곳) 같은 구문은 Common Lisp에 존재하지 않습니다. 스플 라이스 인은 기호 이름이 아닌 목록에만 적용됩니다. |, 수직 막대는 기호의 문자 요소를 둘러 쌉니다. Common Lisp Hyperspec의 설명은 약간은 암호입니다 : Multiple Escape Characters.