[parenscript-devel] Patch: ps loop now supports :ON type of iteration over lists

Vladimir Sedach vsedach at gmail.com
Sat Jul 25 08:13:18 UTC 2009


Pushed.

On Fri, Jul 10, 2009 at 8:30 PM, Daniel Gackle<danielgackle at gmail.com> wrote:
> Two examples followed by patch. Note that I haven't added any functions for
> #'cdr, #'cddr etc. (it's arguable whether those belong in PS proper, since
> the mapping of Lisp lists to JS arrays is only partly satisfactory), so if
> you want to write stuff like "(ps (loop for (a b) on list by #'cddr))", you
> can, but you have to define your own #'cddr.
>
> Dan
>
> (ps (loop for (a b) on y do (blah a b)))
> =>
> "for (var _js46 = y; !(_js46 == null || _js46.length == 0); _js46 =
> _js46.slice(1)) {
>     var a = _js46[0];
>     var b = _js46[1];
>     blah(a, b);
> };"
>
> (ps (loop for (a b . c) on list by somefn do (blah a b c)))
> =>
> "for (var _js48 = list; !(_js48 == null || _js48.length == 0); _js48 =
> somefn(_js48)) {
>     var a = _js48[0];
>     var b = _js48[1];
>     var c = _js48.length > 2 ? slice(_js48, 2) : null;
>     blah(a, b, c);
> };"
>
> From 4122fd1552b35f9bc46d723cf1651fdc8cf20748 Mon Sep 17 00:00:00 2001
> From: Daniel Gackle <danielgackle at gmail.com>
> Date: Fri, 10 Jul 2009 19:17:39 -0600
> Subject: [PATCH 2/2] PS LOOP now supports ON.
>
> ---
>  src/lib/ps-loop.lisp |   22 +++++++++++++++++++---
>  1 files changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/src/lib/ps-loop.lisp b/src/lib/ps-loop.lisp
> index 0e20c9c..c7334fa 100644
> --- a/src/lib/ps-loop.lisp
> +++ b/src/lib/ps-loop.lisp
> @@ -2,12 +2,13 @@
>
>  (defun complex-js-expr? (expr)
>    (if (symbolp expr)
> -      (find #\. (symbol-name expr))
> +      (or (find #\. (symbol-name expr))
> +          (not (eq (ps-macroexpand expr) expr)))
>        (consp expr)))
>
>  (defvar *loop-keywords*
>    '(:for :do :when :unless :initially :finally :first-time :last-time
> :while :until
> -    :from :to :below :downto :above :by :in :across :index := :then :sum
> :collect
> +    :from :to :below :downto :above :by :in :across :on :index := :then
> :sum :collect
>      :count :minimize :maximize :into))
>
>  (defun normalize-loop-keywords (args)
> @@ -18,6 +19,11 @@
>           x))
>     args))
>
> +(defun reduce-function-symbol (sym)
> +  (if (and (consp sym) (eq 'function (first sym)))
> +      (second sym)
> +      sym))
> +
>  (defun parse-ps-loop (terms)
>    (let (prologue
>          init-step-forms end-test-forms
> @@ -115,6 +121,15 @@
>                       (setf terms (append equiv terms))
>                       (clause)
>                       (clause))))
> +               (for-on (var)
> +                 (with-local-var (arr (consume))
> +                   (push `(or (null ,var) (= (length ,var) 0))
> end-test-forms)
> +                   (let* ((by (aif (consume-if :by)
> +                                   `(,(reduce-function-symbol it) ,var)
> +                                   `((@ ,var :slice) 1)))
> +                          (equiv `(:for ,var := ,arr :then ,by)))
> +                     (setf terms (append equiv terms))
> +                     (clause))))
>                 (for-clause ()
>                   (let* ((place (consume))
>                          (var (when (atom place) place))
> @@ -122,13 +137,14 @@
>                          (term (consume-atom)))
>                     (when varlist
>                       (when (eq term :from)
> -                       (err "an atom after FROM" varlist))
> +                       (err "an atom after FOR" varlist))
>                       (setf var (ps-gensym))
>                       (push (list varlist var) destructurings))
>                     (case term
>                       (:from (for-from var))
>                       (:= (for-= var))
>                       ((:in :across) (for-in var))
> +                     (:on (for-on var))
>                       (otherwise (error "FOR ~s ~s is not valid in PS-LOOP."
> var term)))))
>                 (clause ()
>                   (let ((term (consume-atom)))
> --
> 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