Let macro of Common LISP is defined as follows:
(Defmacro our-left (binds & Body) '(lambda, (mapcar #' (lambda (x) (if (consp X) (Car X )) binds), @ body), @ (mapcar # '(lambda (x) (if (consp X) (cadr x) Nil )) binds); (Our-left (x 1) (Y 2) (+ x y) after expansion, it becomes => (lambda (x y) (+ x y) 1 2) here we can easily see that let is actually a Lambda syntactic sugar :)
The let macro of scheme is defined as follows:
(Defien-syntax let (syntax-rules () (_ (x V )...) e1 E2 ...) (lambda (X ...) e1 E2 ...) V ...)))) scheme is more elegant and intuitive than the one above. We can see how this let works internally without effort.
Let * macro of scheme is as follows:
(Define-syntax my-Let * (syntax-rules () (_ (p v) B ...) (Let (p v) B ...)) (_ (P1 V1) (P2 V2 )...) B ...) (Let (P1 V1) (my-Let * (P2 V2 )...) B ...))))) in fact, the macro of scheme is a pattern match, so we must consider all the situations in advance.
There is really no need to use @ to deconstruct. To see how shceme is handled, there is no need to wrap it first and then deconstruct it.