Hi Manuel,
> Unfortunately Rick's solution form doesn't work. May be when calling the
> function the first thing is a string?
> This is what I'm trying:
>
>
> (de *FuncList ())
Are you sure? This sets *FuncList to (NIL), not to NIL
> (de defun1 F
> (setq *FuncList (cons *FuncList (cons (car F) (caddr F))))
> (def (car F) (cons (cadr F) (cadddr F))) )
This is also a bit strange.
(setq *FuncList (cons *FuncList ...
Isn't it the case that you want:
(setq *FuncList (cons ... *FuncList))
which can be written shorter as
(push '*FuncList ..)
?
With your code, you end up with
: *FuncList
-> ((NIL) hola1 . "This is just a test (1)")
Is this desired?
> [manuel@arch ux]$ pil main.l -bye +
> Calling 'hola1'.
> Calling 'hola2'.
> Hola Otto
'hola1' doesn't work, because the function body is not right:
: (pp 'hola1)
(de hola1 (Str)
prinl
"Hola "
Str )
-> hola1
See? 'prinl' is no longer called as a function.
> I was failing because in (def (car P) (cons (cadr P) (cdddr P))) ) I didn't
> put the first cons. When I try
>
> (de defun3 F
> (setq *FuncList (cons *FuncList (cons (car F) (caddr F))))
> (def (car F) (cadr F) (cadddr F)) )
> ^ Notice there isn't cons here
> I get:
>
> [main.l:29] !? (hola2 "Otto")
> hola2 -- Undefined
>
> And, unfortunately, I don't understand why it doesn't works. Why it needs
> to be a cons? In the docs it says def will set the symbol to "any", being
> "any" the third parameter. In my case, shouldn't be set to the parameter
> list?
'def' with three arguments sets a _property_.
If you want to define a function, you must set the _value_.
The reason for (def (car P) (cons (cadr P) (cdddr P))) is this:
'P' is
(hola1 (Str) "This is just a test (1)" (prinl "Hola " Str))
So we have
The CAR is 'hola1', which is the symbol
The CADR is the function's paramter lsit (Str)
The CADDR is the doc string is just a test (1)"
The CDDDR is the function's body ((prinl "Hola " Str))
So
: (cons (cadr P) (cdddr P))
-> ((Str) (prinl "Hola " Str))
which is the desired funcion to be 'def'd as a value to 'hola1'.
♪♫ Alex
--
UNSUBSCRIBE: mailto:[email protected]?subject=Unsubscribe