2017-01-16 3 views
4

평소대로 (cat) 시퀀스 인 DSL 사양이 있습니다. 필자는 spec의 구문 분석 (예 : 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에 대한 스펙을 작성해야합니다. 기본적으로 모든 것을 복제합니다. 실제로 보다 나쁩니다. 왜냐하면 keys에 대한 문서에서 "설계 상 인라인 값 사양에 대한 지원이 없습니다."라는 이유로 술어에 대한 설명이 없기 때문에 이제는 s/def이라는 술어를 사용해야하기 때문입니다./"my.ns/k와 같은 네임 스페이스가 지정된 키워드와 관련된 값의 지정이 해당 키워드 자체에 등록되어야한다는 것은 사양의 (시행 된) 의견입니다."

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 

을 그리고 지금은 호환 될 것으로 보인다 : 그래서합니다 (person-sym 부분을 생략하여) 복제

실제로
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

지금은 두 가지 옵션이 있습니다. 하나는 수행중인 작업을 수행하고 이전/이후의 두 가지 사양을 만드는 것입니다.

다른 옵션은 데이터에 도메인 모델을 만들고 사양 (많은 사람들이 이와 같은 작업을하고있는 것을 보았습니다)을 생성하는 것입니다.

내가 현재 로드맵에있을 가능성이 높지 않아서 부합되는 결과의 출력 사양을 생성하는 것에 대해 Rich가 이야기하지 않았다.

+0

네, 그렇게 생각했습니다. 감사합니다. 당신은 모든 것이 부자의 결정이라는 것을 암시하는 것입니다. 그렇다면 내가 물을 수 있다면, 누구도이 일을 그에게 가져다 주었습니까? 나는 그것이 그것의 가치가있을 것이라고 생각한다. – MasterMastic

+0

나는이 아이디어에 대해 Rich가 들었습니다. –

+0

도와 줘서 고마워. – MasterMastic