你能把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(一种数据描述语言),在我看来,公共/私有的区别似乎有点不合时宜。

我想这与此相关: