2017-01-16 39 views
4

我有一個像往常一樣的序列的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的規範(實際上我個人認爲這是它應該做的事)。有什麼建議麼?

回答

0

我現在說你有兩個選擇 - 一個是做你正在做的事情,併爲之前/之後創建兩組規格。

另一種選擇是在數據中創建您的域的模型並生成兩個規格(我見過很多人正在做這樣的事情)。

我還沒有聽說過關於生成符合結果的輸出規範的富有意義的討論,所以我不認爲這可能在當前的路線圖中。

+0

是的,我明白了,謝謝。你暗示一切都是Rich的決定,如果是這樣的話,如果我可以問,有沒有人把這件事提交給他?我認爲這是值得的。 – MasterMastic

+0

我沒有聽到Rich討論這個想法。 –

+0

我明白了,非常感謝您的幫助! – MasterMastic