It is possible to enter Lisp expressions directly into FriCAS
(including function definitions) using the fricas (1) -> )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 Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. Click We can call the function from FriCAS like this: fricas FOO2(3, Or we can call the function from Lisp like this: lisp (format t "(FOO2 1 2) = ~a~%" (FOO2 1 2) ) lisp Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. Notice that the In the case of an error: lisp (defunny FOO3 (x y) (+ x y)) lisp Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information.
This is a lisp expression that generates some output. lisp (format t "hello, lisp Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. 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 Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. 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 Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. 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 Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. 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 Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. fricas )lisp (funcall (compose #'increment #'square) 3) curry and uncurry lisp (defun printthree (arg1 arg2 arg3) (format *query-io* "arg1 = ~A, lisp Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. fricas )lisp (printthree 3 4 4) lisp (defun curry (function &rest args) (function (lambda (&rest more-args) (apply function (append args more-args))))) lisp Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. 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 Your user access level is compiler and this command is therefore not available. See the )set userlevel command for more information. fricas )lisp (uncurry (curry #'+ 1)) |