【问题标题】:What's the benefit of using Sharpsign Dot?使用 Sharpsign Dot 有什么好处?
【发布时间】:2020-03-19 01:03:09
【问题描述】:

我最近使用了 cl-ppcre 包,我很好奇他们如何优化这个包,因为我想学习优化 common lisp。我注意到他们在声明表达式中经常使用 Sharpsign Dot,例如 here。优化设置为here

他们为什么这样写?有什么好处吗?还是有什么规则让他们去做?

更新: 我跑了

(defvar *b* '(optimize speed))
(pprint (macroexpand-1 '(declaim *b*)))
(pprint (macroexpand-1 '(declaim #.*b*))) ;; => this one is right

那么,#. 会在宏调用之前评估值吗?喜欢它首先评估值并在宏参数中替换它。

【问题讨论】:

    标签: lisp common-lisp reader


    【解决方案1】:

    Sharpsign Dot 将在读取时评估下一个表达式。因此,它将作为读者得到结果,而其他级别的 CL 不知道这一点。由于评估规则,依赖文字的宏不能被动态化,因此读取时间宏将绕过它,并使其成为动态表达式对于阅读器之外的其他级别是文字的。

    好处是额外级别的元编程。

    【讨论】:

    • 将此答案与原始问题联系起来:declaim 是一个宏,它以“声明说明符;未评估”为参数。
    【解决方案2】:

    看看区别:

    CL-USER 7 > (defvar *answer* 42)
    *ANSWER*
    
    CL-USER 8 > '(*answer* #.*answer*)
    (*ANSWER* 42)
    

    #. 允许在读取时计算表达式。结果将从阅读器返回 - 而不是原始表达式。

    CL-USER 9 > '(*answer* (* #.*answer* pi) #.(* pi *answer*))
    (*ANSWER* (* 42 PI) 131.94689145077132D0)
    

    请注意,*answer* 的值需要在读取时知道才能使其工作。

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 2010-09-21
      • 2011-04-28
      • 1970-01-01
      • 2011-09-16
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多