about summary refs log tree commit diff stats
path: root/cabs-syn.lisp
diff options
context:
space:
mode:
authorDarren Bane <darren.bane@gmail.com>2020-08-30 15:32:05 +0100
committerDarren Bane <darren.bane@gmail.com>2020-08-30 15:32:05 +0100
commit4e68c5a3613c8fad09a3bb155222f9d0bd1209e1 (patch)
treeb6b6f57f10b2a0e1c95a4212db1d2ca98de4774b /cabs-syn.lisp
parentd737f1ab887c1d3e7b97cfaa443e6037d5f53c5b (diff)
downloadlsp-4e68c5a3613c8fad09a3bb155222f9d0bd1209e1.tar.gz
Making changes
Diffstat (limited to 'cabs-syn.lisp')
-rw-r--r--cabs-syn.lisp35
1 files changed, 32 insertions, 3 deletions
diff --git a/cabs-syn.lisp b/cabs-syn.lisp
index a339a47..1a921a0 100644
--- a/cabs-syn.lisp
+++ b/cabs-syn.lisp
@@ -1,14 +1,42 @@
+(defpackage #:cabs-syn
+  (:use #:common-lisp)
+  (:export
+   #:<exp-int>
+   #:<exp-var>
+   #:<exp-str>
+   #:<exp-unr>
+   #:<exp-bin>
+   #:<cmd-rem>
+   #:<cmd-goto>
+   #:<cmd-print>
+   #:<cmd-input>
+   #:<cmd-if>
+   #:<cmd-let>
+   #:<phrase-line>
+   #:<phrase-list>
+   #:<phrase-run>
+   #:<phrase-p-end>
+   priority-uop
+   priority-binop))
+(in-package #:cabs-syn)
+
 ;; If these were only C enums, without any payload, I'd just use symbols and (error) in the t case.
 ;; But classes seem better for the associated data, in discriminated unions.
 
-(defclass <expression> () () (:abstractp t))
+;; Is it worth putting just 3 lines in a "cutils.lisp" or something?
+;; Not for now, since it's private.
+(defclass <abstract-class> () ())
+(defmethod make-instance ((self <abstract-class>) &key)
+  (error "Cannot instantiate abstract class ~A" (class-name c)))
+
+(defclass <expression> () () (:metaclass <abstract-class>))
 (defclass <exp-int> (<expression>) ((int :accessor int)))
 (defclass <exp-var> (<expression>) ((var :accessor var)))
 (defclass <exp-str> (<expression>) ((str :accessor str)))
 (defclass <exp-unr> (<expression>) ((op :accessor op) (exp :accessor exp)))
 (defclass <exp-bin> (<expression>) ((exp1 :accessor exp1) (op :accessor op) (exp2 :accessor exp2)))
 
-(defclass <command> () () (:abstractp t))
+(defclass <command> () () (:metaclass <abstract-class>))
 (defclass <cmd-rem> (<command>) ((rem :accessor rem)))
 (defclass <cmd-goto> (<command>) ((goto :accessor goto)))
 (defclass <cmd-print> (<command>) ((expr :accessor expr)))
@@ -18,7 +46,7 @@
 
 (defclass <line> () ((num :accessor num) (cmd :accessor cmd)))
 
-(defclass <phrase> () () (:abstractp t))
+(defclass <phrase> () () (:metaclass <abstract-class>))
 (defclass <phrase-line> (<phrase>) ((line :accessor line)))
 (defclass <phrase-list> (<phrase>) ())
 (defclass <phrase-run> (<phrase>) ())
@@ -35,3 +63,4 @@
     ((eql bin-op 'mod) 4)
     ((member bin-op '(equal less lesseq great greateq diff)) 3)
     ((member bin-op '(and or)) 2)))
+(provide "cabs-syn")