Thanks a lot. It's very interesting. I always appreciate articles/tutorials for beginners.
On Wed, Sep 26, 2018, 5:59 AM Joh-Tob Schäg <johtob...@gmail.com> wrote: > Since there is some much stir around the presentation made by mtsd. (Great > work by the way) I decided it is a good time to put my lightning talk at > FrosCon out there. > Attached is the original version i gave. > Inline is an updated version with more content which could function as a > PicoLisp tutorial or something. > > : "PicoLisp" # Hello today i want to talk a bit PicoLisp. > -> "PicoLisp" > : (* 2 1) #In PicoLisp you can multiply. > -> 2 > : (* 3 (* 2 1)) # You can combine use the return values to make more > complicated expressions. > -> 6 > : (* 4 (* 3 (* 2 1))) > -> 24 > : (** 2 (* 5 (* 4 (* 3 (* 2 1))))) # Numbers in PicoLisp are Integers and > they can be as big as you RAM can handle. > -> 1329227995784915872903807060280344576 > : (* 5 4 3 2 1) # Some functions in Picolisp take an arbitrary number of > arguements. > -> 120 > : (range 1 12) # And of course there are cleverer ways to generale lists > -> (1 2 3 4 5 6 7 8 9 10 11 12) > : (apply * (range 1 6)) # Here we use the multiply function on the list we > generated with 'range > -> 720 > : (de fak (N) (apply * (range 1 N))) # Let's define a function > -> fak > : (mapcar fak (range 1 12)) # Let's test the function by applying to the > number 1 to 12 > -> (1 2 6 24 120 720 5040 40320 362880 3628800 39916800 479001600) > : fak # But what is 'fal , really? > -> ((N) (apply * (range 1 N))) > : ('((N) (apply * (range 1 N))) 8) # It is a list in RAM and the list can > be executed on it's own. > -> 40320 > :(replace fak '(N) '(m)) #This means we can also modify function as f they > are lists > -> ((m) (apply * (range 1 N))) # Truth be told they are actually trees > : (de treeplace (List Old New) # Define a function > which replaces symbols on a tree > (mapcar #For each member of the > list in which Old was Replaced by New > '((X) (if (lst? X) (treeplace X Old New) X)) # Recure on all lists > you see > (replace List Old New))) > -> treeplace > : fak > -> ((N) (apply * (range 1 N))) # This is was fak looked like > : (treeplace fak 1 2) # Multiplying by one is useless > -> ((N) (apply * (range 2 N))) # Tada, we optimed our code > : fak # What is the 'fak now > -> ((N) (apply * (range 1 N))) # Fak has not change since i used > non-destructive operations and did not give 'fak the value > : treeplace > -> ((List Old New) (mapcar '((X) (if (lst? X) (treeplace X Old New) X)) > (replace List Old New))) # The code is not really clear. X is not very > descriptive. > : (setq treeplace (treeplace treeplace 'X 'Sub)) # Since we are working > with a sub-expression or sub-tree let's call it that. > -> ((List Old New) (mapcar '((Sub) (if (lst? Sub) (treeplace Sub Old New) > Sub)) (replace List Old New))) > : treeplace # Setq sets the Symbols value > -> ((List Old New) (mapcar '((Sub) (if (lst? Sub) (treeplace Sub Old New) > Sub)) (replace List Old New))) # See it is way more clear what the code > does now. > > Sincerely Johann-Tobias Schäg >