LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

syntax->datum нормально. А вот convert-sexp — явный признак того, что делается что-то не так.

Правильно должно быть как-то так:

#lang racket
(require (for-syntax racket/syntax))

(define-syntax (make-maker stx)
  (syntax-case stx ()
    [(_ producer input-id ((id val) ...))
     #'(define-syntax (producer stx)
         (syntax-case stx ()
           [(_ suffix input-val)
            (with-syntax ([id (syntax-local-introduce 
                                (format-id #'id "~a~a" (syntax-e #'id) 
                                                       (syntax-e #'suffix)))] ...
                          [input-id #'input-val])
              #'(begin (define id val) ...))]))]))

(make-maker produce-definitions input-id 
            ((id1 (list input-id))
             (id2 (list 1 id1))
             (id3 (list 1 (list id1 (list id2 2))))))

Исходная версия monk, :

syntax->datum нормально. А вот convert-sexp — явный признак того, что делается что-то не так.

Правильно должно быть как-то так:

#lang racket
(require (for-syntax racket/syntax))

(define-syntax (make-maker stx)
  (syntax-case stx ()
    [(_ producer input-id ((id val) ...))
     #'(define-syntax (producer stx)
         (syntax-case stx ()
           [(_ suffix input-val)
            (with-syntax ([id (syntax-local-introduce 
                                (format-id #'id "~a~a" (syntax-e #'id) (syntax-e #'suffix)))] ...
                          [input-id #'input-val])
              #'(begin (define id val) ...))]))]))

(make-maker produce-definitions input-id 
            ((id1 (list input-id))
             (id2 (list 1 id1))
             (id3 (list 1 (list id1 (list id2 2))))))