openlang

可选参数的默认值

Emacs Lisp 没有给可选参数指定非 nil 默认值的语法。为这些参数提供默认值时,通常推荐哪种写法?

为了说明我的意思,下面给出一种过于明确的实现。

  (defun perform (entry &optional given-extra)
  (let ((extra (or given-extra fallback-extra)))
  (perform-body entry extra)))

有没有普遍推荐的写法?

从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    用 cl-defun 可以为可选参数指定各自的默认值表达式。

      (cl-defun perform (entry &optional (extra fallback-extra))
      (perform-body entry extra))

    这里的默认值表达式 fallback-extra 会在每次调用函数时求值。

    从英语翻译查看原文
  2. 固定链接

    如果不用 @tobin 建议的 Common Lisp 扩展,就得检查有没有提供可选参数。要留意,这里其实不需要 let。我觉得下面这样更符合习惯。

      (defun perform (entry &optional extra)
      (or extra (setq extra fallback))
      (perform-body entry extra))

    评论里有人认为,unless 可能比 or 更合适。

      (defun perform (entry &optional extra)
      (unless extra (setq extra fallback))
      (perform-body entry extra))

    评论里还有一个意见,更纯粹的函数式写法可以像问题里那样使用 let,但不需要起两个不同的名字。

      (defun my-perform (entry &optional extra)
      (let ((extra (or extra fallback)))
      (perform-body entry extra)))

    当然,如果可选参数只用一次,直接这样写就行。

      (defun my-perform (entry &optional extra)
      (perform-body entry (or extra fallback)))
    从英语翻译查看原文

同一个问题的其他角度

  1. 在 Godot 3.3 的 GDScript 中怎样随机选择枚举项而不用逐项列出?

    这是我在 GDScript 中使用的枚举声明。 我想随机选择一个枚举变体,而不用列出所有可能的变体。这样以后增加变体时,就不必修改负责随机选择的代码。 我尝试过下面这种方法。 还有这一种。 两种都失败了。一个返回 Null,另一个报告 "Invali…

    回复 2最近活动 gdscript
  2. Nim 求余语法

    Nim 中怎样表示求余运算? cell % 7 == 0 会给出 undeclared identifier: '%' 这个错误 Google 搜索和查看 SO 都没找到答案。

    回复 2最近活动 nim
  3. 从 APL 函数返回结果

    怎样才能让函数在执行结束后返回一个值? 例如我有这样的代码。 ROUTINE N ? N ⍴ 12 //它会生成 N 个从 1 到 12 的随机值 (N 是函数的参数)。 我只是想知道怎样拿到函数的结果,然后比如把这个结果传给另一个函数。 谢谢大家的…

    回复 2最近活动 apl