-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrender.lisp
31 lines (24 loc) · 1.18 KB
/
render.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
(in-package :thierry-technologies.com/2011/07/lambda)
(defgeneric render (expression &key rightmost redex))
(defmethod render ((expression abstraction) &key (rightmost t) redex)
(let ((rendering (format nil "λ~a.~a" (render (abs-var expression)) (render (abs-body expression) :redex redex))))
(if rightmost rendering (format nil "(~a)" rendering))))
(defmethod render ((expression hidden-abstraction) &key rightmost redex)
(declare (ignore rightmost redex))
(hid-name expression))
(defmethod render ((expression variable) &key rightmost redex)
(declare (ignore rightmost redex))
(var-name expression))
(defvar *redex-marker* #\︿)
(defmethod render ((expression application) &key (rightmost t) redex)
(format nil "~a~a~a"
(render (app-fun expression) :rightmost nil :redex redex)
(if (eq redex expression) *redex-marker* #\space)
(let* ((arg (app-arg expression))
(arg-rendering (render arg :rightmost rightmost :redex redex)))
(if (typep arg 'application)
(format nil "(~a)" arg-rendering)
arg-rendering))))
(defmethod print-object ((object expression) stream)
(print-unreadable-object (object stream :type t :identity t)
(princ (render object) stream)))