你能把Clojure规范变成私有的吗?
我有一个“顶点”(平面中的二维点,用一个包含两个双值的贴图表示)和一个“矩形”(平面中一个轴对齐的矩形区域,由一个包含两个“顶点”值的贴图表示)的规范,定义如下:你能把Clojure规范变成私有的吗?,clojure,clojure.spec,Clojure,Clojure.spec,我有一个“顶点”(平面中的二维点,用一个包含两个双值的贴图表示)和一个“矩形”(平面中一个轴对齐的矩形区域,由一个包含两个“顶点”值的贴图表示)的规范,定义如下: ; vertex coordinates are doubles (need to make sure "=" doesn't try to ; compare floats in one vertex and doubles in another one, which fails) (s/def ::vtx-x double?)
; vertex coordinates are doubles (need to make sure "=" doesn't try to
; compare floats in one vertex and doubles in another one, which fails)
(s/def ::vtx-x double?)
(s/def ::vtx-y double?)
; vertex is a map representing a 2D point
(s/def ::vertex (s/keys :req [::vtx-x ::vtx-y]))
; rectangle corners "low" (low x,y) and "high" (high x,y) are vertexes
(s/def ::rec-lo ::vertex)
(s/def ::rec-hi ::vertex)
; rectangle has internal sorting constraint, specified via a predicate
(s/def ::rectangle-internally-sorted
(fn [rect]
(let [lo-vtx (::rec-lo rect)
hi-vtx (::rec-hi rect)
lo-x (::vtx-x lo-vtx)
lo-y (::vtx-y lo-vtx)
hi-x (::vtx-x hi-vtx)
hi-y (::vtx-y hi-vtx)]
(< lo-x hi-x) (< lo-y hi-y))))
; rectangle is a map of two vertexes
; representing an axis-aligned rectangular area
(s/def ::rectangle
(s/and
(s/keys :req [::rec-lo ::rec-hi])
::rectangle-internally-sorted))
;顶点坐标是双倍的(需要确保“=”不尝试
;比较一个顶点中的浮动和另一个顶点中的加倍,但失败)
(s/def::vtx-x双精度?)
(s/def::vtx-y双精度?)
; 顶点是表示二维点的贴图
(s/def::vertex(s/keys:req[::vtx-x::vtx-y]))
; 矩形角“低”(低x,y)和“高”(高x,y)是顶点
(s/def::rec lo::vertex)
(s/def::rec hi::vertex)
; 矩形具有内部排序约束,通过谓词指定
(s/def::内部排序的矩形
(fn[rect]
(让[lo vtx(::rec lo rect)
hi vtx(::rec hi rect)
lo-x(::vtx-x lo vtx)
lo-y(::vtx-y lo vtx)
hi-x(::vtx-x hi vtx)
hi-y(::vtx-y hi-vtx)]
(
客户端代码应该只能使用规范::顶点和::矩形
我可以隐藏(私有)支持规范吗?你不能也不应该。隐藏底层规范只会妨碍您规范的用户,因为他们无法理解规范或gen故障,或者s/form
返回的表单。从这个意义上讲,组件规范不是一个实现细节,它们不可避免地以某种方式呈现给消费者
不过,规范是有名称空间的。您当然可以将内部构件移动到不同的名称空间,您可以为使用者声明超出范围。我想问,从中可以得到什么;Clojure从来没有强调过信息隐藏,尤其是spec(一种数据描述语言),在我看来,公共/私有的区别似乎有点不合时宜。我想这与此相关: