Создать новый идентификатор с макросами - PullRequest
3 голосов
/ 28 января 2011

Я хочу макрос, который создает новый идентификатор, такой как

(new-name first second) => first-second

, который можно использовать для определения новых привязок верхнего уровня

(define-syntax define-generic 
  (syntax-rules ()
    ((define-generic (name a b ...))
     (begin
       (define (new-name name data) 15)      ; <= create a new binding
       (define name (lambda (a b ...)
         (add (new-name name-data) 7))))))   ; <= use new identifier

Если я установлю! значение привязки «новое имя», то оно должно влиять на вновь создаваемую процедуру.

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Это было обсуждение Reddit всего несколько дней назад.Возможно, стоит изучить опубликованную реализацию для более подробной информации - http://www.reddit.com/r/scheme/comments/f54dk/i_wrote_an_hygienic_definemacro_that_can_capture/

0 голосов
/ 28 января 2011

Вы не можете сделать это в чистом R5RS. К счастью, большинство популярных реализаций Scheme предоставляют правильную систему макросов, помимо этого ограниченного гигиенического материала R5RS:

(define-macro (new-name a b) (string->symbol (string-append (symbol->string a) "-" (symbol->string b))))

...