common lisp - Additional symbol LIST when using ,@ -


i observed macro expansion not understand:

(defmacro test (cons-list)   `(list      ,@(mapcar #'(lambda(elem)                    elem)            cons-list)))   (defmacro test-2 ()   `(list ,@(list (cons "a" "b"))))   (defmacro test-3 (cons-list)   `(list ,@cons-list)) 

i'd expect both macros expand in same fashion, use mapcar in fancy way of creating same list again , use list. results observed in sbcl are:

  • (test (list (cons "a" "b"))) expands (list list (cons "a" "b"))
  • (test-2) expands (list ("a" . "b"))
  • (test-3 (list (cons "a" "b"))) again expands (list list (cons "a" "b"))

why don't these macro expansions behave same?

test-2 evaluates form (list (cons "a" "b")), other 2 not.

remember: arguments macro forms read, unevaluated.

in order same behaviour test-2, have quote form: ,@'(list (cons "a" "b")).

edit: here step-by-step expansion of test:

`(list   ,@(mapcar #'(lambda (elem)                 elem)             cons-list)) 

removing backquote syntactic sugar:

(list* 'list (mapcar #'(lambda (elem)                          elem)                      cons-list) 

argument substitution in example:

(list* 'list (mapcar #'(lambda (elem)                          elem)                      '(list (cons "a" "b"))) 

evaluate mapcar form:

(list* 'list '(list (cons "a" "b"))) 

evaluate `list*' form:

'(list list (cons "a" "b")) 

Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -