【问题标题】:When to prefer gensym over make-symbol in Lisp何时在 Lisp 中更喜欢 gensym 而不是 make-symbol
【发布时间】:2012-08-01 17:32:52
【问题描述】:

gensym 将唯一数字附加到前缀的功能会派上用场吗?我不明白为什么会有gensym什么时候

(let ((str "batman"))
  (eq (make-symbol str)
      (make-symbol str)))

总是返回nil

【问题讨论】:

    标签: lisp


    【解决方案1】:

    例如,GENSYM 使调试生成的代码稍微容易一些。

    例子:

    查看 LOOP 宏的扩展。您可以通过查看它们的名称来查看哪些符号是相同的,即使它们没有被保存在包中。有两个 uninterned 临时变量。不同的名称现在可以清楚地使用。

    CL-USER 4 > (pprint (macroexpand '(loop for i in '(1 2 3) sum i)))
    
    (BLOCK NIL
      (MACROLET ((LOOP-FINISH () '(GO #:|end-loop-1103|)))
        (LET ((I NIL) (#:|tail-1106| '(1 2 3)) (#:|by-1107| 'SYSTEM:CDR$CONS))
          (LET ((#:|accumulator-1104| 0))
            (DECLARE (TYPE NUMBER #:|accumulator-1104|))
            (TAGBODY
             #:|begin-loop-1102| NIL
                     (PROGN
                       (WHEN (OR (ENDP #:|tail-1106|)) (GO #:|end-loop-1103|))
                       (LET ((#:|temp-1109| (FUNCALL #:|by-1107| #:|tail-1106|))
                             (#:|temp-1108| (SYSTEM:CAR$CONS #:|tail-1106|)))
                         (SETQ I #:|temp-1108|)
                         (SETQ #:|tail-1106| #:|temp-1109|)))
                     (INCF #:|accumulator-1104| I)
                     (GO #:|begin-loop-1102|)
             #:|end-loop-1103| (RETURN-FROM NIL #:|accumulator-1104|))))))
    

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 2010-09-20
      • 1970-01-01
      • 2022-01-03
      • 2011-08-26
      • 2016-09-24
      • 2011-05-13
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多