Consider this dumbed-down version of do-until:
(module "macro.lsp")
(define-macro (DO-UNTIL test B)
			  (do-while (not (eval test)) (eval B)))
(macro (DO-UNTIL* T B)
	(do-while (not T) B))
(println "test 1")
(define (foo k)
  (DO-UNTIL (<= k 0) (begin (println k) (dec k))))
(foo 3)
(println "test 2")
(define (foo* k) 
	(DO-UNTIL* (<= k 0) (begin (println k) (dec k))))
(foo* 3)
(println "test 3")
(define (bar*)
  (let (k 0)
	(DO-UNTIL* (>= k (args 0)) (begin (println k) (inc k)))))
(bar* 3)
(println "test 4")
(define (bar)
  (let (k 0)
	(DO-UNTIL (>= k (args 0)) (begin (println k) (inc k)))))
(bar 3)
First problem: foo doesn't behave correctly under debug; doing (debug (foo 3)) doesn't do the same as (foo 3)
Second problem: bar doesn't work at all, because (args 0) is evaluated in the context fo the macro DO-UNTIL.
Those kind of problems makes it really tricky to use fexprs. On the other hand, rewrite macros provided by macro.lsp don't have these problems, and are also faster because the substitution is done at compile-time. They however increase the code size, but this can be mitigated by factoring out the "big parts" of macros in external functions.
macro.lsp notes that it increases the load-time of scripts. Is the impact significant? What about native and improved support for rewrite macros?
			
			
			
				Quote
I see 
Quote
fexprs are functions, so I would argue: the behavior is expected. 
To your last question: "should  
			
			
				Quote
Indeed I thought about this possibilty and did something like that. It seems I didn't put enough dashes in my println.
Quote
The problem I see is that one can easily forget that some definition is actually a macro and pass it an expression that contains (args) or $args. This situation typically happens when one nests macros, 
Quote
What about doing it like Forth? Macro symbols could have a special mark, that triggers their execution (after the arguments have been parsed) at compile-time.
			 
			
			
				You mean like , and ,@ and ` operators in Common Lisp?
Quote
Both Common Lisp and Scheme also support the backquote operator (known as quasiquote in Scheme), entered with the ` character (grave accent). This is almost the same as the plain quote, except it allows expressions to be evaluated and their values interpolated into a quoted list with the comma , unquote and comma-at ,@ splice operators. If the variable snue has the value (bar baz) then `(foo ,snue) evaluates to (foo (bar baz)), while `(foo ,@snue) evaluates to (foo bar baz). The backquote is most frequently used in defining macro expansions.[36][37]
If there are several layers of function calls, how do you know if you need to expand (args 0) with quasiquote or not?
			 
			
			
				It would be like the current 
To get rid of back quotes and other special characters in LISP was/is one of newLISP's goals ;)
The 
See also here: http://www.newlisp.org/downloads/newlisp_manual.html#reader-event
Ps: I think Astrobe is talking about the way it it implemented, not the way it works for the programmer. When doing it natively, I could handle things at a lower level not possible with the current implementation as shown in the reader-event example.
			
			
			
				I was referring to this statement by Astrobe:
Quote
The problem I see is that one can easily forget that some definition is actually a macro and pass it an expression that contains (args) or $args. This situation typically happens when one nests macros, id est when one uses macros inside macros.
It is a bit of a "gotcha" that fexprs are function calls and not just inline expansions.g  Although it makes it nicer for debugging.
			 
			
			
				The expansion 
http://www.newlisp.org/downloads/development/inprogress/CHANGES-10.5.8.txt
and runs Astrobe's macro examples fine.
			
			
			
				Very nice.  Did you lift the limitation that macro arguments must be uppercase?
			
			
			
				Oh, nice!
Do I have to wait 10.5.8 to officially come out or can I grab it right now?
			
			
			
				You can grab a source package right now here:
http://www.newlisp.org/downloads/development/inprogress/
also check the new manual entry:
http://www.newlisp.org/downloads/development/inprogress/newlisp_manual.html#macro
Ps: if you cannot compile yourself, I can compile for you an executable for either Windows, OSX or Ubuntu Linux for Windows and Ubunto specify UTF8 or non-UTF8. Let me know.
			
			
			
				
(//%3C/s%3E%3CURL%20url=%22http://i2.wp.com/www.valuerupee.com/wp-content/uploads/2013/04/GRAB-IT-NOW1.jpg%22%3E%3CLINK_TEXT%20text=%22http://i2.wp.com/www.valuerupee.com/wp-%20...%20T-NOW1.jpg%22%3Ehttp://i2.wp.com/www.valuerupee.com/wp-content/uploads/2013/04/GRAB-IT-NOW1.jpg%3C/LINK_TEXT%3E%3C/URL%3E%3Ce%3E)
			 
			
			
				Would it be hard to make delete work on a macro, if I wanted to reuse the symbol as a non-macro?
			
			
			
				Lutz, re: the manual entry for (macro ...)
1. The signature still has 'define' instead of 'macro'.
2. "But macro definitions cannot be repeated for the same symbol during the sane newLISP session." (sane)
			
			
			
				Also, I spotted by chance a misuse of define-macro in the "apply" entry: my-gcd is defined as a macro; but if you try (my-gcd 12 18 (+ 1 2 3)) one gets an error.
			
			
			
				Thanks to Barui and Astrobe. Spelling is fixed and the my_gcd define-macro now evaluates its arguments:
http://www.newlisp.org/downloads/development/inprogress/
There will be a development 10.5.8 release next week and probably an official v.10.6.0 in April.
			
			
			
				I know this is different from what I initially asked for, but...
if you remove lines from 4912 to 4921 (the ones that insert the expansion code), one gets interesting options for forging the replacement expression.
Like for instance this improved curry:
(macro (curry*)
  (case (length $args)
    (2 (letex (F (args 0) A (args 1)) (fn(x) (F A x))))
    (3 (letex (F (args 0) A (args 1) B (args 2)) (fn(x) (F A B x))))))
(set 'K (curry* + 1))
> (lambda (x) (+ 1 x))
(set 'L (curry* + 1 2))
>(lambda (x) (+ 1 2 x))
(copied by hand from another screen; parens might be missing)
What I'm thinking is the functionality of "macro" already exists in a module, and the term "macro" can be confusing together with define-macro, so... What if we call our new feature "inline" (for instance), and we don't restrict it to the functionality of its ancestor?
			
			
			
				The module implementation of 
The new native implementation has no measurable impact on load times, even when defining many macros.
You are still able to do, what you are showing in your post. The default expansion function in C in lines 4912 to 4921 can easily be overwritten once you have marked the symbol as a macro symbol:
; let newLISP know that curry* contains a reader expansion function
> (macro (curry*))
(lambda-macro () (expand 'nil))
; now assign your own for that same symbol
(define curry* (lambda-macro ()
  (case (length $args)
    (2 (letex (F (args 0) A (args 1)) (fn(x) (F A x))))
    (3 (letex (F (args 0) A (args 1) B (args 2)) (fn(x) (F A B x)))))))
> (set 'K (curry* + 1))
(lambda (x) (+ 1 x))
> (set 'L (curry* + 1 2))
(lambda (x) (+ 1 2 x))
> 
What the native implementation of 
You also could code your example without the technique shown above in one step like this:
(macro (curry* F A B)
    (if B (lambda (x) (F A B x)) (lambda (x) (F A x))))
> (curry* + 1)
(lambda (x) (+ 1 x))
> (curry* + 1 2)
(lambda (x) (+ 1 2 x))
			
			
				More explanations how the new 
http://www.newlisp.org/downloads/development/inprogress/newlisp_manual.html#macro
Any corrections are appreciated.
			
			
			
				Hi, Lutz,
In the last example box for (macro ...):
Trailing i a vim oopsie? :-)