It is possible to enter Lisp expressions directly into FriCAS
(including function definitions) using the fricas )lisp (defun foo1 (x y) (+ x y)) fricas )lisp (foo1 2 3) One can put longer programs in files and use On the FriCAS wiki we can enter Lisp code in the same way that we enter FriCAS code. For example: \begin{lisp} (defun FOO2 (x y) (+ x y)) \end{lisp} The text between the \begin{lisp} ... \end{lisp} is saved in a
temporary file (e.g. )lisp (load (compile-file "tempfile.lisp")) lisp ;;; Just a silly example (defun FOO2 (x y) (+ x y)) lisp ; compiling file "/var/aw/var/LatexWiki/5467520105124776552-25px002.lisp" (written 16 SEP 2016 04:02:10 PM): Click We can call the function from FriCAS like this: fricas FOO2(3,
Type: SExpression?
Or we can call the function from Lisp like this: lisp (format t "(FOO2 1 2) = ~a~%" (FOO2 1 2) ) lisp ; compiling file "/var/aw/var/LatexWiki/4849575266889566101-25px004.lisp" (written 16 SEP 2016 04:02:10 PM): Notice that the In the case of an error: lisp (defunny FOO3 (x y) (+ x y)) lisp ; compiling file "/var/aw/var/LatexWiki/7691373298349222252-25px005.lisp" (written 16 SEP 2016 04:02:10 PM):
This is a lisp expression that generates some output. lisp (format t "hello, lisp ; compiling file "/var/aw/var/LatexWiki/229055943891593707-25px006.lisp" (written 16 SEP 2016 04:02:10 PM): Lisp Tutorial 1http://www.cs.sfu.ca/CC/310/pwfong/Lisp/1/tutorial1.html Common LISP reads in an expression, evaluates it, and then
prints out the result. For example, if you want to compute the
value of fricas )lisp (* 2 (cos 0) (+ 4 6)) Here is a more complex recursive function. lisp (defun fibonacci (N) "Compute the N'th Fibonacci number." (if (or (zerop N) (= N 1)) 1 (+ (fibonacci (- N 1)) (fibonacci (- N 2))))) lisp ; compiling file "/var/aw/var/LatexWiki/8805225188305955522-25px008.lisp" (written 16 SEP 2016 04:02:10 PM): We can trace its execution. fricas )lisp (trace fibonacci) fricas )lisp (fibonacci 5) Lisp specification:http://www.lispworks.com/documentation/HyperSpec/Front/ Lisp Links & Notes (advanced)http://www.cs.ucla.edu/classes/winter04/cs161/l1/lispLinks.html by Michael G. Dyer http://www.cs.ucla.edu/classes/winter04/cs161/l1 lambda, closures, apply, funcall, and mapcarOne thing to note here is that the word "thunk" is often used as a synonym for "closure". A closure is defined as a double whose two elements are a pointer to code and a pointer to an environment. In the adder example below, the reason we need the "environment pointer" is that we need a way to remember what n was bound to at the time that (adder 3) was created. This particular "adder" example comes from the CL Cookbook lisp (defun adder (n) (function (lambda (x) (+ x n))) ) lisp ; compiling file "/var/aw/var/LatexWiki/1662804482358068841-25px010.lisp" (written 16 SEP 2016 04:02:10 PM): fricas )lisp (adder 3) fricas )lisp (apply (adder 3) '(4)) fricas )lisp (funcall (adder 3) 4) fricas )lisp (mapcar (adder 3) '(1 2 3 4)) There are two slightly different ways of using mapcar. One is by passing it a lambda block, which is created by simply prepending the #' in front of the function name. The other is to pass it a closure: lisp (defun increment (i) (+ i 1) ) lisp ; compiling file "/var/aw/var/LatexWiki/4211409212481666063-25px012.lisp" (written 16 SEP 2016 04:02:10 PM): fricas )lisp #'increment fricas )lisp (mapcar #'increment '(1 2 3)) fricas )lisp #'(lambda (x) (increment x)) fricas )lisp (mapcar #'(lambda (x) (increment x)) '(1 2 3)) composeLet's take a look at a "higher-order" function, which means that it takes functions as arguments. The compose function is the same as in mathematics. f(g(x)) = compose(f,g)(x) lisp (defun increment (i) (+ i 1) ) lisp ; compiling file "/var/aw/var/LatexWiki/6034342207465796072-25px014.lisp" (written 16 SEP 2016 04:02:10 PM): fricas )lisp (funcall (compose #'increment #'square) 3) curry and uncurry lisp (defun printthree (arg1 arg2 arg3) (format *query-io* "arg1 = ~A, lisp ; compiling file "/var/aw/var/LatexWiki/4952192325462136804-25px016.lisp" (written 16 SEP 2016 04:02:10 PM): fricas )lisp (printthree 3 4 4) lisp (defun curry (function &rest args) (function (lambda (&rest more-args) (apply function (append args more-args))))) lisp ; compiling file "/var/aw/var/LatexWiki/2878124551976497830-25px018.lisp" (written 16 SEP 2016 04:02:10 PM): fricas )lisp (curry #'printthree 'a) fricas )lisp (apply (curry #'printthree 'a) '(b c)) fricas )lisp (curry #'printthree 'a 'b) fricas )lisp (apply (curry #'printthree 'a 'b) '(c)) lisp (defun uncurry (f) #'(lambda (x y) (funcall (funcall f x) y)) ) lisp ; compiling file "/var/aw/var/LatexWiki/6522788210180720678-25px020.lisp" (written 16 SEP 2016 04:02:10 PM): fricas )lisp (uncurry (curry #'+ 1)) |