Как мне проверить наличие ключевого слова в синтаксисе Racket?

#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 Дополнительные аргументы ключевого слова .