1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-20 18:18:51 +03:00

Teach MAL to read and print vectors

This commit is contained in:
Iqbal Ansari 2016-08-15 14:44:28 +05:30
parent ceec6ccd77
commit b36b2ffda7
3 changed files with 18 additions and 11 deletions

View File

@ -6,6 +6,14 @@
(in-package :printer)
(defun pr-mal-sequence (start-delimiter sequence end-delimiter)
(concatenate 'string
start-delimiter
(format nil
"~{~A~^ ~}"
(mapcar #'pr-str (types::mal-value sequence)))
end-delimiter))
(defun pr-str (ast)
(when ast
(case (types::mal-type ast)
@ -14,9 +22,5 @@
('nil "nil")
('string (format nil "~s" (types::mal-value ast)))
('symbol (format nil "~a" (types::mal-value ast)))
('list (concatenate 'string
"("
(format nil
"~{~A~^ ~}"
(mapcar #'pr-str (types::mal-value ast)))
")")))))
('list (pr-mal-sequence "(" ast ")"))
('vector (pr-mal-sequence "[" ast "]")))))

View File

@ -80,22 +80,24 @@
(let ((token (peek reader)))
(cond
((null token) nil)
((string= token "(") (read-list reader))
((string= token "(") (make-mal-list (read-mal-sequence reader)))
((string= token "[") (make-mal-vector (read-mal-sequence reader "]")))
(t (read-atom reader)))))
(defun read-list (reader)
(defun read-mal-sequence (reader &optional (delimiter ")"))
;; Consume the open brace
(consume reader)
(let (forms)
(loop
for token = (peek reader)
while (cond
((null token) (error 'eof :text "EOF encountered while reading list"))
((string= token ")") (return))
((null token) (error 'eof :text (format "EOF encountered while reading list, expected ~a"
delimiter)))
((string= token delimiter) (return))
(t (push (read-form reader) forms))))
;; Consume the closing brace
(consume reader)
(make-mal-list (nreverse forms))))
(nreverse forms)))
(defun read-atom (reader)
(let ((token (next reader)))

View File

@ -29,6 +29,7 @@
(export ',constructor))))
(define-mal-type list)
(define-mal-type vector)
(define-mal-type number)
(define-mal-type symbol)
(define-mal-type string)