3
レキシカルスコープで「let」が高速になるのはなぜですか?
dolistマクロのソースコードを読んでいると、次のコメントに出会いました。 ;; これは信頼できるテストではありませんが、両方のセマンティクスが許容されるため、重要ではありません。一方は動的スコープでわずかに速く、もう一方はレキシカルスコープでわずかに高速です(そしてより明確なセマンティクスを持ちます)。 これはこのスニペットを参照しています(わかりやすくするために簡略化しています)。 (if lexical-binding (let ((temp list)) (while temp (let ((it (car temp))) ;; Body goes here (setq temp (cdr temp))))) (let ((temp list) it) (while temp (setq it (car temp)) ;; Body goes here (setq temp (cdr temp))))) letループ内で使用されているフォームを見て驚いた。以前setqは、同じ外部変数で繰り返し使用するのに比べて遅いと考えていました(上記の2番目のケースで行われます)。 すぐ上のコメントについては、それが代替よりも高速であると明示的に言っている(レキシカルバインディングを使用している)場合を除いて、私はそれを何もないとして却下したでしょう。だから...それはなぜですか? 上記のコードは、字句バインディングと動的バインディングのパフォーマンスが異なるのはなぜですか? let字句を使用するとフォームが高速になるのはなぜですか?