3

プレフィックスに一意の番号を追加する gensym の機能が役立つ場合はありますか? なぜいつがあるのか​​わかりませgensym

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

常に戻りますnil

4

1 に答える 1

6

たとえば、GENSYM を使用すると、生成されたコードのデバッグが少し簡単になります。

例:

この LOOP マクロの展開を参照してください。パッケージにインターンされていなくても、名前を見るとどのシンボルが同じかがわかります。インターンされていない一時変数が 2 つあります。異なる名前により、用途が明確になりました。

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|))))))
于 2012-08-01T19:16:18.820 に答える