Изменить переменную вне лямбды в Схеме / Ракетке - PullRequest
1 голос
/ 09 февраля 2020

Примеры из do c Racket поставляются с lambda всегда: https://docs.racket-lang.org/syntax/Defining_Simple_Macros.html

И мой define-syntax-parser выглядит так:

(require syntax/parse/define)
(define-syntax-parser sp
  [_ #'(lambda (x) (set! x (add1 x)))]
)

(define a 0)
((sp) a)
(display a)

Можно сделать что-то подобное (удалить lambda)?

(require syntax/parse/define)
(define-syntax-parser sp
  [(f x) #'(set! x (add1 x))]
)

(define a 0)
(f a)
(display a)

Ожидается, что результат будет 1, но все равно 0. И Схема / Ракетка не передаются по ссылке (?!), так как изменить эти переменные вне лямбды?

Здесь есть связанный ответ: { ссылка } но это о устарел define-macro (https://docs.racket-lang.org/compatibility/defmacro.html)

1 Ответ

2 голосов
/ 09 февраля 2020

Макрос может расширяться во что угодно, не только lambda.

#lang racket

(require syntax/parse/define)

(define-simple-macro (sp x:id) (set! x (add1 x)))

(define a 0)
(sp a)
(display a)

Или, если вы предпочитаете использовать define-syntax-parser:

#lang racket

(require syntax/parse/define)

(define-syntax-parser sp
  [(_ x:id) #'(set! x (add1 x))])

(define a 0)
(sp a)
(display a)
...