#racket
#racket
Вопрос:
Я хочу проверить, присутствует ли ключевое слово в синтаксическом объекте. Это легко, когда за ключевым словом следует выражение:
(syntax-parse #'(hello #:world "sunny")
[(_ (~optional (~seq #:world <adjective>:str)))
#'(string-append "Hello world! Today's weather is "
(~? <adjective> "unknown"))])
Но если я хочу проверить только наличие ключевого слова, у меня больше нет синтаксической привязки для проверки:
(syntax-parse #'(hello #:world)
[(_ (~optional #:world))
#:with maybe-world (if (attribute #:world) #'" world" #'"") ; doesn't work
#'(string-append "Hello" maybe-world "!")])
Как мне привязать наличие #:world
к синтаксическому атрибуту?
Ответ №1:
Вы можете использовать ~and
для привязки синтаксиса к атрибуту:
(syntax-parse #'(hello #:world)
[(_ (~optional (~and world? #:world)))
#:with maybe-world (if (attribute world?) #'" world" #'"")
#'(string-append "Hello" maybe-world "!")])
Из документа https://docs.racket-lang.org/syntax/stxparse-patterns.html?q =~и#(элемент.(шаблон-ссылка.(~7eand._s))) :
One use for ~and-patterns is preserving a whole term (including its lexical
context, source location, etc) while also examining its structure.
Syntax classes are useful for the same purpose, but ~and can be lighter weight.
Комментарии:
1. Смотрите также 1.2.5 Дополнительные аргументы ключевого слова .