Starting from:

$30

CSCI 316 Assignment 2 Solved

1.  (a)  Can an atom be a variable?                (b) Can a number be a variable?  

    (c)  Can a list be a variable?                      (d) Can an atom have no value? 

(e)   Can an atom have more than one value at the same time? 

(f)    Can a variable have itself as a value? 

(g)   Can a list (A B C) be the value of two different variables? 

 

2.  Each of the following may be a single atom, a single list, or neither.  Identify each       accordingly.  For the lists, also say how many elements the list has.  [You are      not asked to evaluate any expression––e.g., (+ 1 9) would be a list of 3 elements,      even though this list would evaluate to a numeric atom (i.e., 10).]           (a)  ATOMS                                     (b) (THIS IS AN ATOM)        (c)  )( 

          (d) ((A B)(C D)) 3 (3)               (e) (()())                                   

          (f) ((A B C                                          (g) (/ (+ 3 1) (- 3 1))       (h) (LIST 3) 

 

3.[Exercise 4 on p. 37 of Wilensky]  Use SETF to assign X the value (A B C), and      then use X to produce the list (A B C A B C).      

 

4.[Exercise 5 on p. 37 of Wilensky]  Write the expression  ''(A) using QUOTE      rather than '.   What is the data type of the expression 'A ? 

 

5.(a)  Use SETF to give Y the value (A B).  But, instead of writing '(A B), you must           use a Lisp function call to create the list (A B).   

 

   (b) Write code that makes the list  (D A).  However, you must get A from the                    variable Y, which has the value (A B) from part (a). 

 

 

6.             Define a function called SQR that returns a list of the perimeter and the area of            a square, given the length of one side.  Thus (SQR 2) should return (8 4). 

  

                                                        Lisp Assignment 2: Page 1 of  4 

7.             Define QUADRATIC, a function with three parameters A, B and C that returns a         list of the two roots of the equation Ax2 + Bx + C = 0.  You should use the         built-in function SQRT.  Recall that the two roots are given by:   

                                         − +B B2 −4AC     and    − −B B2 −4AC 

                                                   2A                                         2A

 

8.[Exercise 1 on p. 52 of Wilensky]  Write a Lisp function that computes the area of         a circle given its radius.  Use the predefined constant PI. 

 

9.     Define a function called FTOC which takes as its argument a degree reading in     

      Fahrenheit and returns its Celsius equivalent.  (The Celsius equivalent of a                  Fahrenheit temperature is obtained by subtracting 32 and multiplying by 5/9.) 

 

10.  Define a function ROTATE-LEFT which takes a list as argument and returns a           new list in which the former first element has become the last element.  Thus              (ROTATE-LEFT '(A B C D)) should return (B C D A).          

 

11.[Exercise 4 on pp. 52 – 3 of Wilensky] A point (x, y) in the plane can be        represented as a two-element list (x y).  Write a Lisp function that takes two such        lists as arguments and returns the distance between the corresponding points.        Recall that the distance between two points (x1, y1) and (x2, y2) is given by 

       (x1−x2)2 +(y1−y2)2. 

 

12.[Exercise 5 on pp. 52 – 3 of Wilensky] Define Lisp functions HEAD and TAIL       that behave just like CAR and CDR, respectively. 

 

13.[Exercise 6 on pp. 52 – 3 of Wilensky] Define a Lisp function SWITCH that        takes as its argument a two-element list and returns a list consisting of the same       two elements, but in the opposite order.  Example: (switch '(A B)) = (B A). 

 

14.         Suppose you have just entered the following three Lisp expressions at successive        Clisp prompts (with no spaces before or after * and + in 8*7 and 8+7): 

                                                    (setf 8*7 5) 

                   (defun 8+7 (x y) (+ x y))                        (defun 8*7 () 9) 

   If you now enter the expression    (8+7 (* 8 7) (8+7 (8*7) 8*7))       what value will be printed by Clisp?   Check your answer using Clisp. 

 

 

 

 

 

 

 

The next six questions are important.  Be sure to check your answers using Clisp! 

 

15.         [Exercise 1 on pp. 36 – 7 of Wilensky] For each of (a), (b), and (c) below,         suppose SETF has just been used to give the variable E the specified value.   

      (E.g., for (a) we suppose (setf e '(a b x d)) has just been entered at Clisp's         prompt.)  In each case, write an expression that involves only E, car, and cdr,        and which evaluates to the symbol X.   [Hint: For a specified value of (A X C), you         would be expected to write the expression  (car (cdr E)) because the car of the cdr of  

      (A X C) is X.] 

       (a)    (A B X D)      (b) (A (B (X D)))  (c) (((A (B (X) D)))) 

16.[Exercise 2 on pp. 36 – 7 of Wilensky]  For each of the three lists in exercise 15,       write an expression that involves only quoted symbols, NIL, and calls of CONS,        and which evaluates to that list.   [Hint: For a list  (A X C), you would be expected         to write the expression   (cons 'a (cons 'x (cons 'c nil))).] 

       Note: One way to solve such problems is to first write the list using calls of LIST, and then         rewrite the expression using appropriate calls of CONS.  (Another approach is to do a preorder         traversal of the tree-representations of the given lists––read p. 393 in Sethi for more on the         tree-representation of an S-expression.) 

 

For questions 17 – 20, suppose E has been given a value as follows: 

(    '((90 91 92 93 94 95 96 97 98 99) (+ 3 4 –) (9 19 29 39 49 59 69 79 89 99)))setf E    For each question, write an expression with the specified properties; your expressions may involve E, 'A, 'B and Lisp functions.  LIST is a good function to use.   

 

Example  Write an expression that does not involve any numbers, but which evaluates to the following list:       

                   (92 (29 39 49 59 69 79 89 99 + 3 4 -)) 

Solution        (list (third (first E)) (append (rest (rest (third E))) (second E))) 

 [Or, equivalently, (list (caddr   (car E)) (append        (cddr (caddr E))   (cadr E))).] 17. Write an expression that does not involve any numbers, but which evaluates                 to the list  (((90 91) 92 93 94 95 96 97 98 99) (A B 29 39 49 59 69 79 89 99)).  

18. Write an expression that does not involve any numbers, but which evaluates                  to the list ((90 A 92 93 94 95 96 97 98 99) 3  29 (4 29 39 49 59 69 79 89 99)).   19. Write an expression that does not involve any numbers, but which evaluates to             the list   ((90 91 92 93 94 95 96 97 98 99 3) (+ 3 4 – 29 39 49 59 69 79 89 99)). 20. Write an expression that does not involve any numbers, but which evaluates                 to the list ((A 91 92 93 94 95 96 97 98 99) (90 (19 29) 39 49 59 69 79 89 99)). 

 

Working with Lisp Files 

 

Suppose  xyz.lsp  is a file, in your current working directory, that contains one or more Lisp function definitions.  Then you can "load"  xyz.lsp  into Clisp by entering   (load "xyz.lsp")  at Clisp's prompt.  When you do this, the function definitions in xyz.lsp will be read into Clisp as if you had entered them one by one at Clisp's prompt.  [If   (load "xyz.lsp") produces an error, there is a syntax error in the function definitions in  xyz.lsp.]  Unless you are running Clisp as a subprocess of emacs (see below), each time you add a new lisp function definition to a file  xyz.lsp or modify an existing definition in the file, it's a good idea to immediately save the file,  load  the saved file  into Clisp, and then test the new or modified function.  If you work this way, then whenever (load "xyz.lsp") gives an error message it must be because of a syntax error in the new or modified function. 

            For problems 6 – 13,  write your function definitions in a file named solutions.lsp.  On venus or euclid you should create the file in your current working directory––you could use   nano solutions.lsp   to do this.        If you are working on your PC (and have already installed Clisp on the PC), create a folder––c:\316lisp, say–– on the PC to use as your working directory for Lisp. This can be done, e.g., as follows: 

1. Type   Win-r (i.e., hold down the Windows key and type r) to open the Run dialog box. 

2. Type    powershell   into the Open: textbox and press E to open a powershell window. 

3. In the powershell window, enter    md c:\316lisp   to create the folder c:\316lisp. 

All the Lisp files you create for this course (such as solutions.lsp) should be saved in this folder. After the folder has been created, do the following whenever you want to start Clisp on your PC: 

1. Type  Win-r  to open the Run dialog box, type  powershell   into the Open: textbox, and press E. 

2. In the powershell window, enter    cd c:\316lisp   and enter  clisp   to start Clisp. 

Then, assuming you have saved solutions.lsp in c:\316lisp, you will be able to load  solutions.lsp  into Clisp by entering  (load "solutions.lsp") at Clisp's prompt.  

            You should not use  Notepad  to create solutions.lsp on a PC: It is much better to use an editor that matches parentheses for you. Some examples of such editors are listed at the bottom of this page.  I recommend you configure Windows to not hide file name extensions (such as .lsp); this can be done as follows: 

1. Type   Win-r (i.e., hold down the Windows key and type r) to open the Run dialog box. 

2. Type control folders  into the Open: textbox and press E; this opens a folder options dialog box. 

3. Click on the View  tab at the top of the Folder Options dialog box. 

4. In the "Advanced settings" window, find the "Hide extensions for known file types" checkbox. If that checkbox              is unchecked, click Cancel; otherwise, uncheck the checkbox and click OK.  

 

 

Emacs  is a Good Editor for Writing Lisp Code on euclid or venus 

  

To learn to use emacs on euclid, connect to euclid using the native ssh client on a PC (in a cmd or powershell window) or a Mac (in a terminal window) and enter   emacs at the shell prompt. Then (once emacs has started up) type the two characters    Fh t   to bring up a tutorial. This editor automatically matches parentheses––if you place the cursor at an opening parenthesis or immediately after a closing parenthesis, that and the matching parenthesis (if there is one) will be highlighted. Type the two characters   X Ff to move the cursor forward across one S-expression—when the cursor is at an opening parenthesis, this moves the cursor to the position that immediately follows the matching closing parenthesis. Conversely, typing   X Fb will move the cursor backward across one S-expression—when the cursor immediately follows a closing parenthesis, this moves the cursor back to the matching opening parenthesis.  When the cursor is at the start of an S-expression, typing  X Fk  will delete that S-expression (but typing   Fy   will bring it back), whereas typing  X Ft will transpose it with the previous S-expression.   

      You can run Clisp as a subprocess (an “inferior” process) within emacs.  To try this, start emacs on euclid by entering   emacs test.lsp  at the shell prompt.  (Any filename could be used instead of test.lsp.)    Split the emacs window into two by typing  Fx 2   and then enter   X x run-lisp   to get a Clisp [1] prompt in one of the two windows.  After that you can switch back-and-forth between editing  test.lsp and using Clisp simply by typing  Fx o.  As soon as you have written a new function definition or made a change to a function definition in test.lsp, you can load that new/changed definition into Clisp by typing  X Fx  while the cursor is within or immediately to the right of the definition.  This allows you to test new/changed definitions before deciding whether to save the current edited version of  test.lsp.  In the Clisp window, you can cycle backward and forward through previously entered expressions by typing   X p and  X n.   To “unsplit” the window, type   Fx 1  (after which you can switch between the editing and Clisp windows by entering  Fx b).   

            The above instructions also work on venus if you connect to venus using the native ssh client on a PC (in a  cmd or powershell window), provided you have entered  /home/faculty/ykong/316setup  on  venus  at some time this semester as the Lisp Assignment 1 document asked you to do. 

     

Some Other Editors That Match Parentheses 

The  vim editor on venus and euclid matches parentheses automatically; also, if when vim is in command mode you type % at a parenthesis then the cursor will jump to the matching parenthesis. (Enter vimtutor on venus or euclid to bring up a tutorial that teaches beginners to use vim.)  The nano editor on venus and euclid can match parentheses, but not automatically: In nano, typing   X ]  when the cursor is at a parenthesis moves the cursor to the matching parenthesis. Free editors for PCs that support automatic parenthesis matching include:   

 Notepad++  https://notepad-plus-plus.org   

 VS Code    https://code.visualstudio.com  (Don't use the remote-ssh extension to remotely edit files on euclid.)   Atom       https://atom.io          jEdit      http://www.jedit.org   

As with emacs, the vim and nano editors are preinstalled on Macs for use in a terminal window. VS Code, Atom, and jEdit are also available for Macs.  Sublime Text (https://www.sublimetext.com) is another good editor for PCs and Macs that automatically matches parentheses; this editor is not free, but can be evaluated for free.  

More products