【发布时间】:2020-06-04 00:52:08
【问题描述】:
我正在尝试按照 Java (https://craftinginterpreters.com/control-flow.html) 中的这种实现来在 Common Lisp 中实现一种编程语言。
真正令人烦恼的一件事是到处都有大量的槽值。
当然,我可以使用 with-slots 在每个函数中添加一行,但这也是重复的,并且考虑到我的符号不是 :used 但我通过包引用它们,因为许多模块和我不想忘记它们的来源,即使 with-slots 也需要完整的限定名称。在我看来,这一切都像是非常糟糕的代码气味。
我用谷歌搜索并找到了 rutils。使用它的@object.slot 访问器,我设法极大地清理了我的代码。只看最后一次提交 https://github.com/AlbertoEAF/cl-lox/commit/84c0d62bf29bff9a2e0e77042a9108c168542b96?diff=split 摘录:
(我可以粘贴代码,但所有代码都可以在那个 repo 上找到,我想显示差异亮点)
它不仅删除了一些字符,而且更重要的是,需要考虑的深度(槽值调用)和括号的级别减少了 - 这对琐碎的函数有很大帮助。
当我有很多很多符号名称并且由于开始出现符号冲突而无法再将它们全部导出时,情况会变得更糟。
你们能给我关于代码的输入吗?现在看起来好多了,但我很好奇是否有更好的方法来解决它?
谢谢!
【问题讨论】:
-
Code Review 是提出编码风格问题的合适地点。
-
您应该将代码发布为文本,而不是图像。图片难以阅读(您必须将它们展开到另一个窗口),不适合屏幕阅读器,并且无法剪切和粘贴到答案中。
-
经验丰富的 CLOS 程序员只是习惯于使用
slot-value和/或with-slots。 -
我几乎从不使用槽值,而是定义了一个
:reader函数。如果插槽是可变的,则取决于预期谁来改变它:用户?然后我定义了一个:accessor函数。同一包中的内部代码?具有未导出名称的:writer函数。访问器/读取器/写入器更具可读性,并且可以具有 :around 方法等来帮助强制执行属性/行为,这与 slot-value 不同。 -
如果插槽是类的公共接口的一部分,则应该有一个访问器(访问器可能有也可能没有写入器,并且可能会或没有实际读取插槽:那不是该类的任何用户的业务)。任何使用
slot-value的东西都知道类实现的细节,因此是类实现的一部分。
标签: coding-style common-lisp clos