I just came back to say this... http://picolisp.com/wiki/?articlequote looks very helpful but see your very comprehensive reply. I'll have a good look through both of them. Thank you very much Joe.
On 22 November 2016 at 12:51, Joe Bogner <[email protected]> wrote: > On Tue, Nov 22, 2016 at 5:29 AM, dean <[email protected]> wrote: > > > > Joe > > My question came from that very documentation so I'm well aware of it. > > > > I've never used a lambda but your Javascipt example helps a lot and > suggests > > that 'quote' in > > > > > > ((quote (X) (* X X)) 9) > > > > > > transforms the statement into something like > > > > ( > > (de anon (X) > > (* X X) > > ) > > anon 9 > > ) > > > > If that's right..great but the transformation isn't intuitive to me at > > all i.e. I thought quote just stopped the evaluation of a symbol. > > It looks like it's doing a lot more than that here. > > It's not a literal transformation. The phrasing is used to help the > reader understand the execution of the statement. The statement is not > transformed and can still be inspected > > : (setq f1 (quote (X) (* X X))) > -> ((X) (* X X)) > : (f1 9) > -> 81 > > : (car f1) > -> (X) > : (cdr f1) > -> ((* X X)) > > > This is the same as > > : (setq f2 '((X) (* X X))) > -> ((X) (* X X)) > : (f2 9) > -> 81 > > or > > : ('((X) (* X X)) 9) > -> 81 > > > The statements are equivalent > > : (= f1 f2) > -> T > > > > > > > > Also I read that ' is a macro for quote but I couldn't produce a ' > > equivalent of ((quote (X) (* X X)) 9) i.e. > > > > See above > > I suggest reading through the 'Evaluation' section of > http://software-lab.de/doc/ref.html. I've read it several times over > the years. I probably read the reference 3 times before it really > stuck. Often it needs to be re-read as new concepts that have been > learned make it more clear. > > I'll paste some relevant sections that I think help explain the concept.. > > In the example above, f1 is a list, whose CAR is a is a list of symbols > > : (car f1) > -> (X) > > > > -- start paste > > Otherwise, if the CAR is a symbol or a list, PicoLisp tries to obtain > an executable function from that, by either using the symbol's value, > or by evaluating the list. > > What is an executable function? Or, said in another way, what can be > applied to a list of arguments, to result in a function call? A legal > function in PicoLisp is > > .. > > or > a lambda expression. A lambda expression is a list, whose CAR is > either a symbol or a list of symbols, and whose CDR is a list of > expressions. Note: In contrast to other Lisp implementations, the > symbol LAMBDA itself does not exist in PicoLisp but is implied from > context. > > > . > > -- end paste > > Based on the above, we can also write the expression as > > ('(X (* 9 9)) 9) > > : (setq f3 '(X (* 9 9))) > -> (X (* 9 9)) > : (f3 9) > -> 81 > > The statements aren't the same > > : (= f3 f2) > -> NIL > > But the interpreter will execute them the same since the CAR of the > list is a symbol (not a list of symbols as-is f2). A list of symbols > is more common to see > > : (car f3) > -> X > > Hope this helps. The key here is realizing that quote/' doesn't > literally transform to a de, it just evaluates as if it did > > Joe > > On Tue, Nov 22, 2016 at 5:29 AM, dean <[email protected]> wrote: > > > > Joe > > My question came from that very documentation so I'm well aware of it. > > > > I've never used a lambda but your Javascipt example helps a lot and > suggests > > that 'quote' in > > > > > > ((quote (X) (* X X)) 9) > > > > > > transforms the statement into something like > > > > ( > > (de anon (X) > > (* X X) > > ) > > anon 9 > > ) > > > > If that's right..great but the transformation isn't intuitive to me at > > all i.e. I thought quote just stopped the evaluation of a symbol. > > It looks like it's doing a lot more than that here. > > > > Also I read that ' is a macro for quote but I couldn't produce a ' > > equivalent of ((quote (X) (* X X)) 9) i.e. > > > > : ((quote (X) (* X X)) 9) > > -> 81 > > : (('(X) (* X X)) 9) > > !? (('(X) (* X X)) 9) > > NIL -- Undefined > > ? > > : (('X (* X X)) 9) > > !? ('X (* X X)) > > X -- Undefined > > > > > > Best Regards > > Dean > > > > On 22 November 2016 at 04:16, Joe Bogner <[email protected]> wrote: > >> > >> Hi dean, > >> > >> It's not clear what you're asking. Does this help explain it? > >> > >> http://software-lab.de/doc/tut.html > >> > >> --- from the page --- > >> > >> Anonymous functions without the lambda keyword > >> > >> There's no distinction between code and data in PicoLisp, quote will > >> do what you want (see also this FAQ entry). > >> > >> : ((quote (X) (* X X)) 9) > >> -> 81 > >> > >> : (setq f '((X) (* X X))) # This is equivalent to (de f (X) (* X X)) > >> -> ((X) (* X X)) > >> : f > >> -> ((X) (* X X)) > >> : (f 3) > >> -> 9 > >> > >> --- end from the page --- > >> > >> And http://software-lab.de/doc/ref.html > >> > >> "The most prominent read-macro in Lisp is the single quote character > >> "'", which expands to a call of the quote function. Note that the > >> single quote character is also printed instead of the full function > >> name." > >> > >> --- > >> > >> In other words, quote is allowing you to define an anonymous function > >> equivalent to (function(x) { return x*x })(9) (in javascript for > >> example) > >> > >> On Mon, Nov 21, 2016 at 3:37 PM, dean <[email protected]> wrote: > >> > I could do with some help understanding step by step what's happening > >> > here... > >> > > >> > Intuitively I can see that 9 squared is 81 but I can't really see, > >> > precisely, what this was doing > >> > > >> > ((quote (X) (* X X)) 9) > >> > -> 81 > >> > > >> > so I put it in a function in a file to trace it > >> > > >> > (de go () > >> > ((quote (X) (* X X)) 9) > >> > ) > >> > > >> > but it's not giving me the step by step explanation I was hoping for > >> > > >> > : (trace go) > >> > !? (method "X" C) > >> > (('((X) (* X X)) 9)) -- Symbol expected > >> > ? > >> > > >> > Any help to understand what's happening at each stage would be very > much > >> > appreciated. > >> > > >> > Thank you in anticipation. > >> -- > >> UNSUBSCRIBE: mailto:[email protected]?subject=Unsubscribe > > > > > -- > UNSUBSCRIBE: mailto:[email protected]?subject=Unsubscribe >
