gpt4 book ai didi

clojure - 避免 Clojure DSL 中的名称冲突

转载 作者:行者123 更新时间:2023-12-02 11:51:52 25 4
gpt4 key购买 nike

作为一个业余项目,我正在创建一个用于图像合成的 Clojure DSL ( clisk )。

我有点不确定函数命名的最佳方法,DSL 中的函数与 Clojure 核心中的函数类似,例如,需要 + 函数或类似的东西我的 DSL 用于附加地合成图像/执行向量数学运算。

据我所知,有几个选项:

  1. 在我自己的命名空间中使用相同的名称 (+)。在 DSL 代码中看起来不错,但会覆盖 clojure.core 版本,这可能会导致问题。人们可能会感到困惑。
  2. 使用相同的名称,但要求其经过限定 (my-ns/+)。避免冲突,但会阻止人们为了方便而使用命名空间,而且看起来有点难看。
  3. 使用不同的简称,例如(v+)。可以轻松使用并避免冲突,但名称有点难看,可能很难记住。
  4. 使用不同的长名称,例如(矢量相加)。冗长但描述性强,没有冲突。
  5. 排除clojure.core/+并使用多方法+重新定义(如georgek建议)。

示例代码可能类似于:

 (show  (v+ [0.9 0.6 0.3] 
(dot [0.2 0.2 0]
(vgradient (vseamless 1.0 plasma) ))))

最好/最惯用的方法是什么?

最佳答案

首先,中缀表达式中运算符的重复出现需要良好的语法,但对于具有前缀语法的 lisp 来说,我认为这并不那么重要。因此,让用户为显式命名空间输入更多字符并不是什么犯罪行为。并且 clojure 对命名空间和别名有很好的支持。因此用户可以很容易地选择自己的短前缀:(x/+ ...)例如。

第二,查看reader docs没有太多的非字母数字符号可供使用,所以类似 :+出来了。所以没有“可爱”的解决方案 - 如果你选择一个前缀,它必须是一个字母。这意味着类似 x+ - 最好让用户选择一个别名,但代价是多一个字符,并且有 x/+ .

所以我想说:忽略核心,但期望用户(:require .... :as ...) 。如果他们非常喜欢您的软件包,希望将其设为默认软件包,那么他们可以 (:use ...)并明确处理核心。但您为运算符选择前缀似乎是一个糟糕的妥协。

(我认为我没有见过任何使用单字母前缀的库)。

另一种可能性是提供上述内容以及一个具有长名称而不是运算符的单独包(它们只是简单地定义为与原始包中的值匹配)。那么如果人们确实想要 (:use ...)但想要避免冲突,他们可以使用它(但 (vector-add ...) 相对于 (vector/+ ...) 的优势是什么?)

最后我会检查如何 +已实现,因为如果它已经涉及某种类型的分派(dispatch),那么georgek的评论就很有意义。

(上面的“运算符”只是指单字符、非字母数字符号)

关于clojure - 避免 Clojure DSL 中的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11608136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com