我有一個像往常一樣的序列的DSL規範(cat
)。我想利用規範的解析(即conform
ing)來獲得符合我的DSL的表達式的AST。例如。現在符合規格/ AST的規格
user> (s/def ::person (s/cat :person-sym '#{person} :name string? :age number?))
=> :user/person
user> (s/conform ::person '(person "Henry The Sloth" 55))
=> {:person-sym person, :name "Henry The Sloth", :age 55}
,它的解析,我有我的AST,我想要做有趣的事情呢,所以我想對它進行測試和諸如此類的東西。所以現在我需要爲AST編寫一個規範,基本上所有東西都是重複的。其實這是差比那,因爲現在我必須s/def
規格的謂詞,我沒有以前,因爲keys
文檔說:「不支持內聯值規範,按設計。」 /「規範的(強制)觀點認爲,與名稱空間關鍵字相關聯的值的規範(如:my.ns/k)應該在該關鍵字本身下注冊。」。所以複製(與省略person-sym
部分):
user> (s/def ::name string?)
=> :user/name
user> (s/def ::age number?)
=> :user/age
user> (s/def ::person-ast (s/keys :req-un [::name ::age]))
:user/person-ast
而現在它似乎是兼容的:
user> (s/conform ::person-ast (s/conform ::person '(person "Henry The Sloth" 55)))
=> {:person-sym person, :name "Henry The Sloth", :age 55}
在實踐中,我當然有更復雜的數據,我不知道我該怎麼辦? AFAIK規範並沒有給我創建AST的規範(實際上我個人認爲這是它應該做的事)。有什麼建議麼?
是的,我明白了,謝謝。你暗示一切都是Rich的決定,如果是這樣的話,如果我可以問,有沒有人把這件事提交給他?我認爲這是值得的。 – MasterMastic
我沒有聽到Rich討論這個想法。 –
我明白了,非常感謝您的幫助! – MasterMastic