In C-style array initializers, commas can serve to separate items or to end items; for example, I could write
int foo[3] = {0,1,2};
int bar[3] = {0,1,2,};
The latter form is useful for long lists, either computer-generated
or human-maintained, which must change from time to time.
the right size?
(defstruct mj-env stdout ; standard output stream stderr ; error output stream parents ; class-name -> parent class-name assoc classes ; class-name -> class layout hash methods ; (class-name . method-name) -> method info hash stack) ; Run-time stack (defstruct mj-method class ; Name of this class (for setting 'this' type) name ; Method name formals ; Formal parameter list (as an (id . type) assoc list) layout ; Stack frame layout code ; Statement list type ; Return value type value) ; Return value expression ;; Variable layouts are hash tables with ;; *count* -> current number of variables ;; name -> stack of (index . type) pairs
class Week9 {
public static void main(String[] a) {
System.out.println(new Counter().Init(1).Next());
}
}
class Counter {
int count;
public Counter Init(int c) { count = c; return this; }
public int Next() { count = count + 1; return count; }
}
;; === Translated from ../notes/week9 ===
(unless (boundp '*mj-stdout*) (setf *mj-stdout* t))
;; Counter::Init
(DEFUN |mjl-Counter-Init| (THIS L1) (LET () (SETF (ELT THIS 1) L1) THIS))
;; Counter::Next
(DEFUN |mjl-Counter-Next| (THIS)
(LET () (SETF (ELT THIS 1) (+ (ELT THIS 1) 1)) (ELT THIS 1)))
;; Vtable for Counter
(SETF |mjl-Counter| (MAKE-HASH-TABLE))
(SETF (GETHASH '|Next| |mjl-Counter|) #'|mjl-Counter-Next|)
(SETF (GETHASH '|Init| |mjl-Counter|) #'|mjl-Counter-Init|)
;; Constructor for Counter
(DEFUN |mjl-Counter+| ()
(LET ((OBJ (MAKE-ARRAY '(2))))
(SETF (ELT OBJ 0) |mjl-Counter|)
(SETF (ELT OBJ 1) 0)
OBJ))
;; Main routine
(FORMAT *MJ-STDOUT*
"~A~%"
(LET* ((OBJ
(LET* ((OBJ (|mjl-Counter+|)) (VTABLE (ELT OBJ 0)))
(FUNCALL (GETHASH '|Init| VTABLE) OBJ 1)))
(VTABLE (ELT OBJ 0)))
(FUNCALL (GETHASH '|Next| VTABLE) OBJ)))