[parenscript-devel] Added count, minimize, and maximize to ps-loop
Vladimir Sedach
vsedach at gmail.com
Tue Jul 7 00:26:23 UTC 2009
Pushed.
On Tue, Jun 30, 2009 at 7:56 PM, Daniel Gackle<danielgackle at gmail.com> wrote:
> I've added count, minimize, and maximize to ps-loop. Examples and patch
> follow.
>
> Daniel
>
> (ps (loop for x from 1 to 10 count x into c))
>
> =>
>
> "var c = 0;
> for (var x = 1; x <= 10; x += 1) {
> ++c;
> };"
>
> (ps (loop for x from 1 to 10 minimize x into y maximize x into z))
>
> =>
>
> "var y = null;
> var z = null;
> for (var x = 1; x <= 10; x += 1) {
> y = y == null ? x : Math.min(y, x);
> z = z == null ? x : Math.max(z, x);
> };"
>
>
> From ee44a1647b9289c50c5fe1f2bc62c569aa0c990e Mon Sep 17 00:00:00 2001
> From: Daniel Gackle <danielgackle at gmail.com>
> Date: Tue, 30 Jun 2009 19:52:12 -0600
> Subject: [PATCH] Added support for COUNT, MINIMIZE and MAXIMIZE to PS-LOOP.
>
> ---
> src/lib/ps-loop.lisp | 18 ++++++++++++++----
> 1 files changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/src/lib/ps-loop.lisp b/src/lib/ps-loop.lisp
> index 1003b5d..0e20c9c 100644
> --- a/src/lib/ps-loop.lisp
> +++ b/src/lib/ps-loop.lisp
> @@ -7,7 +7,8 @@
>
> (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 :into))
> + :from :to :below :downto :above :by :in :across :index := :then :sum
> :collect
> + :count :minimize :maximize :into))
>
> (defun normalize-loop-keywords (args)
> (mapcar
> @@ -60,20 +61,29 @@
> (when (and default-accum-kind (not (eq kind
> default-accum-kind)))
> (error "PS-LOOP encountered illegal ~a: ~a was already
> declared, and there can only be one kind of default accumulation per loop."
> kind default-accum-kind))
> (unless default-accum-var
> - (setf default-accum-var (ps-gensym kind)
> + (setf default-accum-var (ps-gensym (case kind
> + (:minimize 'min)
> + (:maximize 'max)
> + (t kind)))
> default-accum-kind kind))
> (setf var default-accum-var))
> - (let ((initial (case kind (:sum 0) (:collect '(array)))))
> + (let ((initial (case kind
> + ((:sum :count) 0)
> + ((:maximize :minimize) nil)
> + (:collect '(array)))))
> (pushnew `(var ,var ,initial) prologue :key #'second))
> (case kind
> (:sum `(incf ,var ,term))
> + (:count `(incf ,var))
> + (:minimize `(setf ,var (if (null ,var) ,term (min ,var
> ,term))))
> + (:maximize `(setf ,var (if (null ,var) ,term (max ,var
> ,term))))
> (:collect `((@ ,var :push) ,term))))
> (body-clause (term)
> (case term
> ((:when :unless) (list (intern (symbol-name term))
> (consume)
> (body-clause (consume-atom))))
> - ((:sum :collect) (accumulate term (consume) (consume-if
> :into)))
> + ((:sum :collect :count :minimize :maximize) (accumulate
> term (consume) (consume-if :into)))
> (:do (consume-progn))
> (otherwise (err "a PS-LOOP keyword" term))))
> (for-from (var)
> --
> 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