To earn full credit the work must be done before the end of the lab and should contain a list of at least 3 notes. Each note is a short paragraph with one or two sentences and a new LISP function (or link to a file containing the function). The sentences should say what the function does and what you learned by writing it.
Let me know by
calling me across to your workstation when done.
Here are some simple LISP expressions/commands. Load the LISP interpreter and input each in turn. Try to predict what each will return as a value before inputting it:
(+ 1 2)
(1 + 2)
(* (+ 1 2) (+ 3 4))
(+ 1 2 3 4)
(A B C)
'(A B C)
((1 . 2) . 3)The data looks like this (with a 'o' replacing the '.').
Down load/Save this file as text: [ show.lsp ]
Use this UNIX command to look inside the file:
Run this UNIX command in a terminal window:
Inside the running XLISP try these command:
(show '(a b))
(show '(a b c))
(show '(a b c d))
(show '((a b)(c d)))
This function (or something like it) is a handy tool when you want to see the structure of a complex list structure.... for example the value show itself.
( defun a () 4321)
(+ a 1)
(+ (a) 1)Copy and paste the above XLISP commands into XLISP in a terminal window.
Then define and test a new function called answer that returns the value 42.
Functions with a single parameter
Here is how we would define a LISP function with a single
argument that returns a list:
(defun square (x) (* x x))Here is how you test it...
Here is how you can use it:
(square (+ 1 2 3))
(+ (square 3) (square 4) )
(+ 3 (square 3) )Test the above!
Here is how XLISP can list it:
squareXLISP does not let you edit a function however!
Do not leave LISP until you complete the next two steps.
Here is a function for the cube:
(defun cube (x) (* x (square x)))Test it.
Define a function called fourth that returns the fourth power of a number. Use the fact that the fourth power on n is the square of the square of n:
Test it. And save it...
Functions with two or more parameters
Functions of more arguments/parameters are done the same way
using the syntax
Here is a definition of a function with two arguments in LISP:
(defun pythagoras (x y) (+ (square x) (square y)))
(pythagoras 3 4)Some common errors
(pythagoras 1 3 4)
Here is a function that return the larger of two expressions:
(defun max2 (a b) (cond ((> a b) a) (T b)))
(max2 1 17)
(max2 17 1)
(max2 (max2 3 5) (max2 4 1))
(max2 (square 3) (cube 2))
Define a function called min2 that returns the smallest of two
arguments. Test it and save it....
From the book -- Association lists
(assoc expression a-list)as a built in function. Example
(assoc 2 '((1 a) (2 b) (3 c)))Finds the value of the expression in the a-list and returns the pair.
(2 b)Test it out... it is not the one in the book.
Define a new function called bookassoc that does work like the one in the book and uses assoc to do the hard work.
A Binary Search
Here is a function that searches for the positive square root of a
positive number. It uses the square function. It has four arguments:
(defun binroot (target lo hi error )
(let (( mid (/ (+ lo hi) 2.0))) ; this saves the time to recalculate mid
(if (<= (- hi lo) error)
(if (< (square mid) target)
(binroot target mid hi error)
(binroot target lo mid error)
)Here is how I tested it:
(binroot 50 0 100 0.05)Test it further and trace it.
The above algorithm will find roots of any monotonic increasing
Modify it to find cube roots and fourth roots of positive numbers.
From the book -- Property lists
In XLISP we have:
We don't have the book's put function. Use one of the above functions to define the book's put function.
Optional experiments if you have time
(defun power (x n)
((= n 0) 1)
((= n 1) x)
(T (* x (power x (- n 1))))
)Here are two test cases
(power 2 3)
(power 3 2)Test with the trace function....
However this is not a very fast way to calculate powers. There
is another one based on these facts:
Can you figure out how to speed up the original power function?
An example of top-down design in LISP
[ primes.html ]
. . . . . . . . . ( end of section Optional experiments if you have time) <<Contents | Index>>
To exit lisp, input the EOT character CTRL/D
. . . . . . . . . ( end of section CS620 LISP Laboratory Number 2) <<Contents | Index>>