[parenscript-devel] Added support for supplied-p parameters to optional and keyword arguments
Vladimir Sedach
vsedach at gmail.com
Sat May 9 23:37:51 UTC 2009
I've pushed this and your destructuring-bind extension patch. Thanks
for the contributions!
Vladimir
On Fri, May 8, 2009 at 11:07 PM, Daniel Gackle <danielgackle at gmail.com> wrote:
> I extended PS's optional and keyword arguments to handle supplied-p
> parameters. Patch below.
>
> Daniel
>
>
> From b2c6b36e0c3582be703f861170fd6d2ea9cba4c6 Mon Sep 17 00:00:00 2001
> From: Daniel Gackle <danielgackle at gmail.com>
> Date: Fri, 8 May 2009 15:13:18 -0600
> Subject: [PATCH 2/2] Added support for supplied-p parameters to optional and
> keyword arguments.
>
> ---
> src/special-forms.lisp | 24 ++++++++++++++----------
> 1 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/src/special-forms.lisp b/src/special-forms.lisp
> index a6d363f..7ac8e77 100644
> --- a/src/special-forms.lisp
> +++ b/src/special-forms.lisp
> @@ -252,9 +252,11 @@ Syntax of key spec:
> (values (if (symbolp spec) spec (first spec))
> (when (listp spec) (second spec))))
>
> -(defpsmacro defaultf (place value)
> - `(when (=== ,place undefined)
> - (setf ,place ,value)))
> +(defpsmacro defaultf (name value suppl)
> + `(progn
> + ,@(when suppl `((var ,suppl t)))
> + (when (=== ,name undefined)
> + (setf ,name ,value ,@(when suppl (list suppl nil))))))
>
> (defun parse-extended-function (lambda-list body &optional name)
> "Returns two values: the effective arguments and body for a function with
> @@ -264,11 +266,12 @@ the given lambda-list and body."
> ;; list of variable names, and you have access to the arguments variable
> inside the function:
> ;; * standard variables are the mapped directly into the js-lambda list
> ;; * optional variables' variable names are mapped directly into the
> lambda list,
> - ;; and for each optional variable with name v and default value d, a
> form is produced
> - ;; (defaultf v d)
> + ;; and for each optional variable with name v, default value d, and
> + ;; supplied-p parameter s, a form is produced (defaultf v d s)
> ;; * keyword variables are not included in the js-lambda list, but
> instead are
> ;; obtained from the magic js ARGUMENTS pseudo-array. Code assigning
> values to
> - ;; keyword vars is prepended to the body of the function.
> + ;; keyword vars is prepended to the body of the function. Defaults and
> supplied-p
> + ;; are handled using the same mechanism as with optional vars.
> (declare (ignore name))
> (multiple-value-bind (requireds optionals rest? rest keys? keys allow?
> aux? aux
> more? more-context more-count key-object)
> @@ -282,8 +285,9 @@ the given lambda-list and body."
> (mapcar #'parse-optional-spec optionals))))
> (opt-forms
> (mapcar #'(lambda (opt-spec)
> - (multiple-value-bind (var val) (parse-optional-spec
> opt-spec)
> - `(defaultf ,var ,val)))
> + (multiple-value-bind (var val suppl)
> + (parse-optional-spec opt-spec)
> + `(defaultf ,var ,val ,suppl)))
> optionals))
> (key-forms
> (when keys?
> @@ -291,11 +295,11 @@ the given lambda-list and body."
> (with-ps-gensyms (n)
> (let ((decls nil) (assigns nil) (defaults nil))
> (mapc (lambda (k)
> - (multiple-value-bind (var init-form
> keyword-str)
> + (multiple-value-bind (var init-form
> keyword-str suppl)
> (parse-key-spec k)
> (push `(var ,var) decls)
> (push `(,keyword-str (setf ,var (aref
> arguments (1+ ,n)))) assigns)
> - (push (list 'defaultf var init-form)
> defaults)))
> + (push (list 'defaultf var init-form suppl)
> defaults)))
> (reverse keys))
> `(, at decls
> (loop :for ,n :from ,(length requireds)
> --
> 1.6.1
>
>
>
> _______________________________________________
> parenscript-devel mailing list
> parenscript-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>
More information about the parenscript-devel
mailing list