Re: a bunch of questions about syntax

2017-01-28 Thread pd
Thank you Alex for your patience, I see I have a severe confussion about
how picolisp manages lists

let's start by the begining... as far as I know   (f a b 4)  is just a list
equivalent to (f . (a . (b . (4 . NIL  and the fact being also a
function call to function f applying parameters a b 4 is just a matter of
"convention", simply when picolisp evals a list with a first item not being
a number it supposes it's a function call and tries to evaluate first item
(it doesn't matter if first item is a symbol or another list, it gets
evaluated) which is supposed to be evaluated to a function value

With this point of view I understand what you mean when saying  (f 1 a b c)
is just the same as (f 1 . (a b c)) and thus you can view a, b, c as a list
so you can describe this funcion as (f num . 'lst), ok, but also I think
you could describe the function f also as (f . 'lst) . The only difference
is that using the latter you are only interested in remark you pass to f a
sequence of symbols (which form a list) while using the former description
you are interested in remark the first symbol in the sequence is supposed
to be a number and also it is not evaluated.

But if you describe a function like (g num 'lst) is a quite different thing
because you are expecting two arguments the first one being a number and
the second being a list (of unlimited number of items), really all
functions described have an unlimited number of arguments but function g
packs all arguments but the first in a list.

I think I get the point, but what confuses me is when you say

On Sat, Jan 28, 2017 at 8:31 AM, Alexander Burger 
wrote:

> > From this point of view my question is about the difference of using or
> > > not using dot when describing a function, for example, take the if
> > > description:
> > >
> > > (if 'any1 any2 . prg) -> any
> > >
> > > Would the description below describe the same function?
> > >
> > > (if 'any1 any2 prg) -> any
>
> A typical call of 'if' could be
>
>(if (testSomething) (doSomething1) (doSomething2) (doSomething3))
>
> where
>
>any1 is the result of evaluating (testSomething)
>any2 is (doSomething1)
>prg is ((doSomething2) (doSomething3))
>
> Perhaps it helps understanding if we remember that
>
>(if (testSomething) (doSomething1) (doSomething2) (doSomething3))
>
> is the same as
>
>(if (testSomething) (doSomething1) . ((doSomething2) (doSomething3)))
>
>
> If 'if' were specified as in the second case (if 'any1 any2 prg), then we
> would
> need to call it as
>
>(if (testSomething) (doSomething1) ((doSomething2) (doSomething3)))
>
> to match the spec (if 'any1 any2 prg) and get the same bindings.
>
>
but this also means the only way to indicate several executable expressions
in the "then-clause" is to surround them between parens, i.e.  (if (= 2 2)
((print "equal") (print "2")) (print "not equal") (print "not 2"))   I
appreciate here an absence of symmetry, you must pack all exe expressions
in a list for "then-clause" but you can't do it for "else-clause"  [in fact
I think it will fail if you do that in a "then-clause" like (if T 1 ((print
"ups") (print "error"))) ]

why not to define and describe function if in a symmetrical way as   (if
'any prg1 prg2)  even when not obeying parens economy?   (sure there is a
good reason to do it that way simply I'm not able to see)

this way you always write prgs inside a list whatever being in then-clause
or an else-clause   i.e.  (if (> a b) ((print "a greater")) ((print "b
greater or equal")))


>
> > > (if T 3 4)   #
> invalid because 4 is a number not a prg (a list)
>
> Yes, but the prg is (4), not 4.
>

I guess you say that because using the "stack" simil you used in previous
email, when you pop first item it remais (T 3 4) when you pop again it
remains (3 4) and with next pop which remains is (4)

I think my confusion is due to the lack of one more pop to get 4 rather
than (4) , if the answer is "because prg indicates its a list, if you want
to indicate a number you should use num instead" then my confusion is like
this:

- two functions f described this way:

   (f num . lst)
   (f num1 num2)

then the list (f 1 2) is a valid call for both functions, the first f will
bind first parameter to numer 1 and second parameter to list (2) (all
remaining parameters as a list) while the second f will bind 1 to num1 and
2 to num2 (descarding empty list NIL). My confusion here is picolisp must
do two pops to bind parameters for a first f function call but three pops
to bind parameters for a second f function call. How discriminate picolisp
between each cases? I suppose the answer is function definition:

first f defined as (de f (X . Rest) (...) )
second f defined as (de f (X Y) (...) )

is it ok?


thanks a lot and forgive my insistence ;-)


Re: (NIL) vs Nothing

2017-01-28 Thread Alexander Burger
Hi Christophe,

> > (de fltr (Buf Ln)
> >(setq New_buf (mapcar '((Ele) (pack (tail (- (length Ln)) (chop Ele
> >   (filter '((Ele) (pre? Ln Ele)) Buf
> 
> I'm not an expert, I just want to warn and maybe be confirmed.
> As Alex said recently, PicoLisp programs should rarely use setq.

Indeed! When I saw the above definition, I was ready to say something about it.
But then I understood that Dean obviously just extracted a sample from some
other code he is working on, and that the 'setq' might be the remains of
experimentation.


> I'd add (please confirm):
> 1) especially in function definitions, as
> 2) it creates/modifies like «global variables», which many consider
> bad practice.

Yes. At least - if it is really necessary - is should be named '*New_buf' to
mark it clearly as a global.

♪♫ Alex
-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe


Re: (NIL) vs Nothing

2017-01-28 Thread Christophe Gragnic
Hi all,

On Fri, Jan 27, 2017 at 7:01 PM, dean  wrote:
> I've got this filtering function
>
> (de fltr (Buf Ln)
>(setq New_buf (mapcar '((Ele) (pack (tail (- (length Ln)) (chop Ele
>   (filter '((Ele) (pre? Ln Ele)) Buf

I'm not an expert, I just want to warn and maybe be confirmed.
As Alex said recently, PicoLisp programs should rarely use setq.
I'd add (please confirm):
1) especially in function definitions, as
2) it creates/modifies like «global variables», which many consider
bad practice.


chri
--
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe


Re: (NIL) vs Nothing

2017-01-28 Thread dean
That' greatthank you for both examples.

On 27 January 2017 at 19:03, Alexander Burger  wrote:

> Hi Dean,
>
> > (de fltr (Buf Ln)
> >(setq New_buf (mapcar '((Ele) (pack (tail (- (length Ln)) (chop
> Ele
> >   (filter '((Ele) (pre? Ln Ele)) Buf
> > ...
> > #: (fltr '(aa ab) 'ab)
> > #-> (NIL)
>
> You can use 'extract' to get exactly the results you need:
>
>(de fltr (Buf Ln)
>   (let N (inc (length Ln))
>  (extract
> '((Ele)
>(when (pre? Ln Ele)
>   (pack (nth (chop Ele) N)) ) )
> Buf ) ) )
>
>
> Perhaps 'match' is more elegant than 'pre?' and 'nth' or 'tail':
>
>(de fltr (Buf Ln)
>   (let Pat (conc (chop Ln) '(@Rest))
>  (use @Rest
> (extract
>'((Ele)
>   (and (match Pat (chop Ele)) (pack @Rest)) )
>Buf ) ) ) )
>
> In both cases:
>
>: (msg (fltr '(aa ab abc) 'ab))
>-> ("c")
>
> ♪♫ Alex
> --
> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe
>