"macros" in miniPicoLisp

2024-02-09 Thread C K Kashyap
Hi Alex,

Does this look like a reasonable way to create the "create-adder" function?

(de create-adder Args
   (let
  (N (car Args)
 Adder (intern (pack "add-" N))
 P
 (list
'de
Adder
'(X)
(list '+ N 'X) ) )
  (eval P) ) )

: (create-adder 10)
-> add-10
: (add-10 20)
-> 30

If I understand correctly, the "macro" capability of miniPicoLisp is not at
par with PicoLisp right?

Regards,
Kashyap


Re: "macros" in miniPicoLisp

2024-02-09 Thread Alexander Burger
Hi Kashyap,

> Does this look like a reasonable way to create the "create-adder" function?
> 
> (de create-adder Args
>(let
>   (N (car Args)
>  Adder (intern (pack "add-" N))
>  P
>  (list
> 'de
> Adder
> '(X)
> (list '+ N 'X) ) )
>   (eval P) ) )
> 
> : (create-adder 10)
> -> add-10
> : (add-10 20)
> -> 30

Yes, but you can do it a little simpler by directly calling 'def':

   (de create-adder (N)
  (def (intern (pack "add-" N))
 (list '(X) (list '+ N 'X)) ) )

Note also that I use (N), i.e. an evaluated argument, as this makes the function
more general.


Even simpler if you use 'curry':

   (de create-adder (@N)
  (def (intern (pack "add-" @N))
 (curry (@N) (X)
(+ @N X) ) ) )

It is especially simpler if the function body, which is here just (+ N X), is
more complicated, because then the 'list'ing and 'cons'ing of the body would
become very unreadable.


> If I understand correctly, the "macro" capability of miniPicoLisp is not at
> par with PicoLisp right?

The 'macro' function of mini and normal PicoLisp is the same I think.

☺/ A!ex

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


Re: "macros" in miniPicoLisp

2024-02-09 Thread C K Kashyap
Super! - thank Alex.

On Fri, Feb 9, 2024 at 11:17 AM Alexander Burger 
wrote:

> Hi Kashyap,
>
> > Does this look like a reasonable way to create the "create-adder"
> function?
> >
> > (de create-adder Args
> >(let
> >   (N (car Args)
> >  Adder (intern (pack "add-" N))
> >  P
> >  (list
> > 'de
> > Adder
> > '(X)
> > (list '+ N 'X) ) )
> >   (eval P) ) )
> >
> > : (create-adder 10)
> > -> add-10
> > : (add-10 20)
> > -> 30
>
> Yes, but you can do it a little simpler by directly calling 'def':
>
>(de create-adder (N)
>   (def (intern (pack "add-" N))
>  (list '(X) (list '+ N 'X)) ) )
>
> Note also that I use (N), i.e. an evaluated argument, as this makes the
> function
> more general.
>
>
> Even simpler if you use 'curry':
>
>(de create-adder (@N)
>   (def (intern (pack "add-" @N))
>  (curry (@N) (X)
> (+ @N X) ) ) )
>
> It is especially simpler if the function body, which is here just (+ N X),
> is
> more complicated, because then the 'list'ing and 'cons'ing of the body
> would
> become very unreadable.
>
>
> > If I understand correctly, the "macro" capability of miniPicoLisp is not
> at
> > par with PicoLisp right?
>
> The 'macro' function of mini and normal PicoLisp is the same I think.
>
> ☺/ A!ex
>
> --
> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe
>