-
Notifications
You must be signed in to change notification settings - Fork 2
/
acl-ch7.lisp
44 lines (36 loc) · 1.33 KB
/
acl-ch7.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
;; 1. Define a function that takes filename and returns a list of the lines
;; in the file.
(defun file->lst-of-lines (file)
(file->lst file #'read-line))
(defun file->lst (file reader)
(with-open-file (str file :direction :input)
(let ((retval nil))
(do ((line (funcall reader str nil :eof)
(funcall reader str nil :eof)))
((eql line :eof))
(push line retval))
retval)))
;; 2. Define a function that takes a filename and returns a list of the
;; expressions in the file.
(defun file->lst-of-expr (file)
(file->lst file #'read))
;; 3. Define a function that removes comments from a file and writes the result
;; to a second file. Suppose that comments start with '%' and run to the end of
;; the line.
(defun remove-%comments (in out)
(with-open-file (instr in :direction :input)
(with-open-file (outstr out :direction :output :if-exists :supersede)
(let ((seen nil))
(do ((c (read-char instr nil :eof)
(read-char instr nil :eof)))
((eql c :eof))
(cond (seen (when (eql c #\newline)
(princ c outstr)
(setf seen nil)))
((not seen)
(if (eql c #\%)
(setf seen t)
(princ c outstr)))))))))
;; 4. Define a function that takes a two dimensional array of floats and
;; displays it in neat columns. Each element should be printed with two digits
;; after the decimal point in a field.