Hi Tomas,

> : (make (link 1) (chain (cons 2 3)))
> -> (1 2 . 3)
> ...
> I would expect:
>
> : (make (link 1) (chain 2))
> -> (1 . 2)

Right, this would take on the same philosophy as 'append' or 'conc':

   : (append (1) 2)
   -> (1 . 2)

But here, too, it only works for the last element, and in

   : (append '(a b) 'c '(d e))
   -> (a b d e)

the 'c' is ignored.

In this respect, 'chain' is analogous, it simply processes the cell
arguments, and does not preserve any CDRs, as it cannot not know if
later more elements will be added with 'link' or 'chain'.

> I guess this is not currently achievable using 'make'?

The following would do that

   : (make (link 1) (conc (made) 2))
   -> (1 . 2)

but is rather inefficient because it traverses the whole (made) list to
concatenate the '2'.


Anyway, this seems to be a useful feature. It basically just needs the
exchange of two lines in 'doChain()' in "src/subr.c":

   do {
      if (isCell(y = EVAL(car(x)))) {
         *Env.make = y;
         do

   ->

   do {
      *Env.make = y = EVAL(car(x));
      if (isCell(y)) {
         do


Should I keep that change?

Cheers,
- Alex
-- 
UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe

Reply via email to