Common Lisp: Why progn is a special form?

前端 未结 2 1001
失恋的感觉
失恋的感觉 2021-01-04 01:01

Since Common Lisp\'s function arguments evaluate in left-to-right order, why wouldn\'t use an ordinary function:

(defun progn2 (&rest body)
  (first (las         


        
相关标签:
2条回答
  • 2021-01-04 01:36

    There is also another feature of PROGN which you can't get with a function:

    Imagine this code in a file of Common Lisp code:

    (progn
      (defmacro foo () ))
    

    vs.

    (my-progn
      (defmacro foo () ))
    

    With using PROGN the compiler will treat the DEFMACRO form as a top-level form. That means for example that the compiler notes that there is a macro definition and makes it available in the compile-time environment.

    Using a function MY-PROGN, the compiler won't recognize the DEFMACRO form, because it is not at top-level.

    0 讨论(0)
  • 2021-01-04 01:43

    progn returns all the values of the last form it evaluates, your function returns just the first one:

    (progn (values 1 2 3)) 
    =>  1, 2, 3
    (progn2 (values 1 2 3)) 
    =>  1
    

    Another critical feature of progn (mentioned by Rainer first) is that it keeps all its forms top-level, which makes it possible for macros to expand to multiple forms (see, e.g., my answer to "“value returned is unused” warning when byte-compiling a macro").

    0 讨论(0)
提交回复
热议问题