diff --git a/lib/record.mes b/lib/record.mes new file mode 100644 index 00000000..af8a98c8 --- /dev/null +++ b/lib/record.mes @@ -0,0 +1,6 @@ +(define make-record make-vector) +(define record-set! vector-set!) +(define record? vector?) +(define (record-type x) (vector-ref x 0)) +(define record-ref vector-ref) + diff --git a/lib/srfi/srfi-9.scm b/lib/srfi/srfi-9.scm index 3adc5dc5..43fc45fd 100644 --- a/lib/srfi/srfi-9.scm +++ b/lib/srfi/srfi-9.scm @@ -2,7 +2,7 @@ ;; There's no implicit name concatenation, so it can be defined ;; entirely using syntax-rules. Example: -;; (define-record-type foo type/foo +;; (define-record-type foo ;; (make-foo x y) ;; foo? - predicate name is optional ;; (x foo-x) @@ -13,18 +13,18 @@ (define-syntax define-record-type (syntax-rules () - ((define-record-type id type + ((define-record-type type (constructor arg ...) (field . field-stuff) ...) - (begin (define type (make-record-type 'id '(field ...))) + (begin (define type (make-record-type 'type '(field ...))) (define constructor (record-constructor type '(arg ...))) (define-accessors type (field . field-stuff) ...))) - ((define-record-type id type + ((define-record-type type (constructor arg ...) pred more ...) - (begin (define-record-type id type + (begin (define-record-type type (constructor arg ...) more ...) (define pred (record-predicate type)))))) diff --git a/mes.c b/mes.c index 80107455..e170a3c0 100644 --- a/mes.c +++ b/mes.c @@ -835,9 +835,13 @@ display_helper (scm *x, bool cont, char *sep, bool quote) if (!cont) printf (")"); } else if (x->type == VECTOR) { - printf ("#[%d](", x->length); - // for (int i = 0; i < x->length; i++) - // display_helper (x->vector[i], true, i ? " " : "", false); + printf ("#(", x->length); + for (int i = 0; i < x->length; i++) { + if (x->vector[i]->type == VECTOR) + printf ("%s#(...)", i ? " " : ""); + else + display_helper (x->vector[i], true, i ? " " : "", false); + } printf (")"); } else if (atom_p (x) == &scm_t) printf ("%s", x->name); diff --git a/record.mes b/record.mes new file mode 100644 index 00000000..fb15dabe --- /dev/null +++ b/record.mes @@ -0,0 +1,15 @@ +(define-record-type lexical-token + (make-lexical-token category source value) + lexical-token? + (category lexical-token-category) + (source lexical-token-source) + (value lexical-token-value)) + +(define tok (make-lexical-token 'x 'y 'z)) + +(display "tok?: ") +(display (lexical-token? tok)) +(newline) + +(display tok) +(newline) diff --git a/syntax.mes b/syntax.mes index eca054f2..3baa811a 100644 --- a/syntax.mes +++ b/syntax.mes @@ -39,8 +39,6 @@ ;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(display "mes:define-syntax...") - (define-macro (define-syntax macro-name transformer . stuff) `(define-macro (,macro-name . args) (,transformer (cons ',macro-name args) @@ -58,11 +56,6 @@ ;; ((or e1 e ...) (let ((temp e1)) ;; (if temp temp (or e ...)))))) -(newline) - -(display "mes:define-syntax syntax-rules...") -(newline) - (define-syntax syntax-rules (let () (define name? symbol?)