2016-01-20 2 views
4

Я хочу, чтобы иметь возможность написать:Ракетка макрос для расширения кода

(nota E2 82) 

вместо:

(define E2 
    (network() 
      [sunet <= sine-wave 82] 
      [out = (+ sunet)])) 

Я знаю, что я могу сделать это с помощью макросов и попытался написать это:

(define-syntax (nota stx) 
    (syntax-case stx() 
    [(nota x) #'(network() 
         [sunet <= sine-wave x] 
         [out = (+ sunet)])])) 

Но я получаю эту ошибку:

nota: bad syntax in: (nota E2 82) 
+1

Вы забыли 'define'? – stchang

+2

Причина, по которой вы получили ошибку «плохой синтаксис», состоит в том, что '(nota x)' указывает, что ваш макрос принимает только один «аргумент», но вы дали ему два. Как упоминает @stchang, похоже, что вы хотите добавить дополнительный аргумент и включить 'define' в расширение. –

ответ

5

Самым простым решением было бы

(define-syntax-rule (nota x y) 
    (define x 
    (network() 
      [sunet <= sine-wave y] 
      [out = (+ sunet)]))) 
+0

Короткое и элегантное решение! Оно работает. Спасибо! –

3

Хорошо, это просто ужасно. Вам действительно не нужно писать этот макрос; должна быть форма, которая поставляет фиксированные входы в сеть.

Фактически, есть. Но ... это не задокументировано, и это плохо названо. В настоящее время он называется fixed-inputs, но я собираюсь переименовать его как network-const и задокументировать его.

Спасибо за подсказку!

John

+0

Для будущего подтверждения этого ответа вы можете ссылаться на документы, когда делаете? (И когда будет выпущена следующая версия Racket с ней.) –

 Смежные вопросы

  • Нет связанных вопросов^_^