Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.1 6/24/83; site allegra.UUCP
Path: utzoo!linus!philabs!cmcl2!floyd!clyde!burl!ulysses!allegra!jdd
From: jdd@allegra.UUCP (John DeTreville)
Newsgroups: net.lang.lisp
Subject: Emily Litella Meets Optional Arguments in Franz Lisp
Message-ID: <2518@allegra.UUCP>
Date: Fri, 8-Jun-84 13:29:53 EDT
Article-I.D.: allegra.2518
Posted: Fri Jun  8 13:29:53 1984
Date-Received: Sat, 9-Jun-84 08:14:00 EDT
Organization: AT&T Bell Laboratories, Murray Hill
Lines: 67


	From: alan@allegra.UUCP (Alan S. Driscoll)
	Newsgroups: net.lang.lisp
	Subject: Optional Arguments in Franz Lisp

	We're running Franz Lisp under 4.2 BSD.  I'm having a problem
	compiling functions with optional arguments.  This code works
	correctly when interpreted:

		(defun f (&optional x &optional y) (cons x y))

	When compiled, liszt gives the following error message:

		?Error: test.l: f: illegal form in lambda list (&optional y)
		?Error: test.l: : Compilation aborted due to previous errors

	Has anyone else run into this compiler bug?

One can get around this problem by eliminating the second &optional.

	From: broome@brl-tgr.ARPA (Paul Broome )
	Newsgroups: net.lang.lisp
	Subject: Re: Optional Arguments in Franz Lisp

	Re: 	(defun f (&optional x &optional y) (cons x y))

	Is the '&' doing something special?  The function compiles
	and runs correctly without the '&' under version 8.36 of Liszt
	and Opus 38.79 of Franz.

"What's all this fuss about optical arguments?"

This also shows a bug in the interpreter and the compiler in that they allow
an argument to appear twice.

	From: chris@umcp-cs.UUCP
	Newsgroups: net.lang.lisp
	Subject: Re: Optional Arguments in Franz Lisp

	As I understand it [and I only dabble in Franz occasionally so don't
	take this TOO seriously],

	    (defun f (&optional ...

	makes some optional arguments, with [again optional] default values
	if said optional arguments are not passed.

	    (defun f (&optional (x nil) (y 'foo)) ...

	should make ``x'' bound to the first argument if any, nil if none,
	and ``y'' bound to the second argument if any, or 'foo if none.
	[It may also be written as ``(&optional x (y 'foo))''.]

	As far as I know, &optional must come after all the non-optional
	arguments, not be used twice, and not be used in conjunction with
	&rest.

Well, almost.  There is no official definition of &optional in Franz, due to
Franz's convoluted parentage.  In the Lisps that it tries to copy, &optional
may be used any number of times (evidently a problem in Liszt).

Even in Franz, &optional can be used with &rest.  You can also say things
like (... &optional ... (x nil x-present?) ...) to bind x-present? to
whether x gets bound to an actual argument.

Cheers,
John ("()") DeTreville
Bell Labs, Murray Hill