2017-12-25 44 views
3

Scheme 매크로는 "파생 된"식별자를 만드는 것이 일반적입니다. 예를 들어 R6RS 구문 레코드 API를 사용하여 foo 레코드 유형을 정의하는 방법은 기본적으로 make-foo이라는 생성자를 정의합니다. 내 자신의 매크로에서 비슷한 것을하고 싶었지만 표준 라이브러리 내에서 깨끗한 방법을 찾을 수 없었습니다."파생 된"식별자를 만드는 가장 깨끗한 방법은 무엇입니까?

(define (identifier-add-prefix identifier prefix) 
    (datum->syntax identifier 
       (string->symbol (string-append prefix 
               (symbol->string (syntax->datum identifier))))) 

내가 데이텀에 문자열로 심볼을 변환 (식별자로 가정) 구문 개체를 변환은,의 접두사와 새 문자열을에 해당 문자열로 변환 : 나는이 글을 쓰는 결국 그 심볼을 마지막으로 identifier과 같은 구문 환경에서 식별자로 변환하십시오.

이 방법은 효과가 있지만 우연히 만지작 거리는 것처럼 보입니다. 이 일을하는 데 더 깔끔하고 관용적 인 방법이 있습니까?

답변

1

위생적 인 매크로는 아니지만, 다음과 같이 define-syntax를 사용할 수 있다고 가정 해 보겠습니다. 치킨 계획의 경우 매크로 설명서는 here입니다. 또한 this SO question은 치킨 계획 매크로에 대해 설명합니다. 마지막으로 나는 이것이 문제에 접근하는 관용적 방법인지는 모른다.

(use format) 
(use srfi-13) 

(define-syntax recgen 
    (lambda (expr inject compare) 
    `(define (,(string->symbol (string-append "make-" (cadr expr)))) (format #t "called")))) 

#> (recgen "bar") 
#> (make-bar) 
called 

단일 위 (시작 ...) 그 게터/세터 또는 기록과 상호 작용하는 다른 방법을 정의로 변경 될 수 있습니다 정의합니다.