With only little change I could bring the (args) functionality into normal functions and without affecting performance in newlisp-8.4.2.tgz
The way (args) works has changed for the case that the maco or function specifies locals variable
and uses (args) to retrieve the argument list. In this case (args) only returns the unbound arguments not already taken by local vars:
(define (foo) (args))
(foo 1 2 3 4 5) => (1 2 3 4 5)
;; but
(define (foo a b) (args))
(foo 1 2 3 4 5) => (3 4 5) ; only args not already bound to locals
This makes it necessary to rewrite all macros having both, locals vars and use (args). In most cases the changes will lead to simpler code, as normally (args) is only wanted for the unbound arguments not already passed by local vars. I.e. this changes the definition of 'defun' and 'edit' in init.lsp. In some instances macros are not necessary at all, when only used to get the (args) functionality which is now also available in normal functions.
See also changed doc of 'args' in the manual. Look for the files in the development directoy
http://newlisp.org/downloads/development
This development release contains also many fixes/changes in the manual, doing a complete pass through all built-in function descriptions.
If possible I want to make this version a release next week.
Lutz