В LISP, в чем разница между «пусть» и «с»? - PullRequest
3 голосов
/ 06 февраля 2012

Простой пример, демонстрирующий различия в действии, действительно помог бы, поскольку мне они кажутся просто взаимозаменяемыми?Спасибо:)

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Они действительно функционально эквивалентны.

На самом деле, по крайней мере, SBCL расширяет любое использование with при вызове макроса loop во вложенную форму LET.

Выполняетсяследующее:

(macroexpand '(loop with foo = 5 repeat 10 collect foo))

В результате получается следующее расширение:

(BLOCK NIL
  (LET ((FOO 5))
    (LET ((#:LOOP-REPEAT-1681 (CEILING 10)))
      (DECLARE (TYPE INTEGER #:LOOP-REPEAT-1681))
      (SB-LOOP::WITH-LOOP-LIST-COLLECTION-HEAD (#:LOOP-LIST-HEAD-1682
                                                #:LOOP-LIST-TAIL-1683)
        (SB-LOOP::LOOP-BODY NIL
                            ((IF (<= #:LOOP-REPEAT-1681 0)
                                 (GO SB-LOOP::END-LOOP)
                                 (DECF #:LOOP-REPEAT-1681)))
                            ((SB-LOOP::LOOP-COLLECT-RPLACD
                              (#:LOOP-LIST-HEAD-1682 #:LOOP-LIST-TAIL-1683)
                              (LIST FOO)))
                            ((IF (<= #:LOOP-REPEAT-1681 0)
                                 (GO SB-LOOP::END-LOOP)
                                 (DECF #:LOOP-REPEAT-1681)))
                            ((RETURN-FROM NIL
                               (SB-LOOP::LOOP-COLLECT-ANSWER
                                #:LOOP-LIST-HEAD-1682))))))))
1 голос
/ 06 февраля 2012

В Common Lisp, по крайней мере, вы можете использовать with только в контексте макроса loop.См. Common Lisp Hyperspec .

...