| > Well, then, if you don't have macros, then you don't have procedural macros, which was my point. Trivially. Anyway, I don't consider them to be Lisp dialects anyway. They are new languages, Scheme dialects, scripting languages with parentheses, whatever. The name 'new'LISP says it already. > I said it technically had better performance. You thought it had, without actually knowing it. CL-USER 36 > (let* ((bar '(1 2 3))
(baz `(foo ,@bar)))
(eq bar (rest baz)))
T
So it's not copied and no traverse is needed.What actually is traversing the code is your IR-macro mechanism. Twice. -> ir-macro-transformer. Which makes it slower both in the interpreter and the compiler. https://github.com/bnoordhuis/chicken-core/blob/master/expan... Traverses the code, then calls the handler, traverses it again... Btw., the code won't win any beauty contests. |
It's good to know that splicing unquote optimizes for that case in Lisp. I wasn't sure, and so assumed the general case. In any case, that's not the reason I didn't use it, as I've explained multiple times now.
Yes, I know ir-macro does code traversal. Yes, sc-macros are more elegant. But that's the mechanism we picked, And I have no issue with it. Furthermore, it doesn't traverse all the same code twice. It traverses the inputs and the outputs.
>Btw., the code won't win any beauty contests.
...Says the CL user. Actually, I agree, it won't. But it works, it's reasonably clear, and it doesn't do anything obviously stupid. It's okay.
...Unless you're talking about my code. You want me to clean that up? Okay. I will.
We still have to bind our args by hand, because it's Scheme, but it's not too bad.