# [Maxima] join N lists ?

Gosei Furuya go.maxima at gmail.com
Sun Jun 3 12:02:55 CDT 2007

hi Stavros
This cords is rewritten Barton's flatten.lisp.
So lists of sets  or sets of list  are almost  correct.
And  level error  is free. but it can not treat matrix.
(%i9) nflatten([[{a,b,c},d],[e,f]],2);
(%o9)                  [{a, b, c}, d, e, f]
(%i10) nflatten([[{a,b,c},d],{e,f}],2);
(%o10)                 [{a, b, c}, d, {e, f}]
(%i11) nflatten({[{a,b,c},d],[e,f]},2);
(%o11)                {[{a, b, c}, d], [e, f]}
(%i12) nflatten({[{a,b,c},d],[e,f]},3);
(%o12)                {[{a, b, c}, d], [e, f]}
(%i13) nflatten({{{a,b,c},d},[e,f]},2);
(%o13)                  {a, b, c, d, [e, f]}

gosei furuya

(defun \$nflatten (e &optional (n 5))
(setq e (ratdisrep e))
(cond ((or (\$atom e) (\$subvarp e)(or (member (\$inpart e 0) (list '&^
'&=))))
e)
(t
(let ((op (multiple-value-list (get-op-and-arg e))))
(setq op (car op))
(setq e (mapcar #'(lambda (x) (flatten-op x op n)) e))
(setq e (reduce #'append e))
(cond ((and (consp (car op)) (eq (caar op) 'mqapply))
(append op e))
(t
`(,op , at e)))))))

(defun flatten-op (e op nlev)
(let ((e-op) (e-arg))
(setq e-op (multiple-value-list (get-op-and-arg e)))
(setq e-op (car e-op))
(cond ((and (>= nlev 1)(equal e-op op))
(mapcan #'(lambda (x) (flatten-op x op (1- nlev))) e-arg))
(t
(list e)))))

2007/6/4, Stavros Macrakis <macrakis at alum.mit.edu>:
>
> On 6/3/07, Gosei Furuya <go.maxima at gmail.com> wrote:
> >
> > I would like to use flatten with outermap,
> > I wrote newflatten dunction.
> >
> > (%o4)                     newflatten.lisp
> > (%i5) nflatten([[[a,b,c],d],[e,f]],1);
> > (%o5)                  [[a, b, c], d, e, f]
> > (%i6) nflatten([[[a,b,c],d],[e,f]]); /*default level 3*/
> > (%o6)                   [a, b, c, d, e, f]
> > (%i7) nflatten([[[a,b,c],d],[e,f]],2);
> > (%o7)                   [a, b, c, d, e, f]
> > how do you think?
> >
>
> I like the idea of specifying how many levels.  In particular, this means
> you could give a useful error message in cases where N levels aren't
> present, which will, I suspect, catch a lot of errors -- but I see from %o6
> that you do not do this.  I would have thought that the intuition of
> nflatten was that you know a priori that the object consists precisely of
> nested lists to N levels.  Also, I wonder if nflatten works only for the "["
> operator, or for other operators as well, and for mixed operators, e.g.
> sets of lists or lists of sets.  If so, is the result a list or a set?
>
>               -s
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.math.utexas.edu/pipermail/maxima/attachments/20070604/fb6886eb/attachment.htm