defstruct
(
define-macro defstruct (lambda (x . ff) (
(let (
(i -1)
(j -1)
(struct-name (symbol->string x))
(keys (map (lambda (x) (if (pair? x) (car x) (x))) ff))) (
`(
(define ,(string->symbol (string-append 'mark-' struct-name)) (lambda (,@keys) (
(cons
(vector 'struct' ,struct-name)
(vector ,@keys)))))
(define ,(string->symbol (string-append 'verify-struct-' struct-name)) (lambda (o) (
(if
(not (and (eqv? 'struct' (vector-ref (car o) 0)) (eqv? ,struct-name (vector-ref (car o) 1)) ))
(error ,(string-append 'not-struct ' struct-name))))))
,@(map (lambda (n) (
(set! i (+ i 1))
(
`(define ,(string->symbol (string-append struct-name '.' (symbol->string n))) (lambda (o) (
(,(string->symbol (string-append 'verify-struct-' struct-name)) o)
(vector-ref (cdr o) ,i)
)))
)
)) keys)
,@(map (lambda (n) (
(set! j (+ j 1))
(
`(define ,(string->symbol (string-append struct-name '.' (symbol->string n) '-set!')) (lambda (o v) (
(,(string->symbol (string-append 'verify-struct-' struct-name)) o)
(vector-set! (cdr o) ,j v)
)))
)
)) keys) ))))))
使用
(
(defstruct box (name width height size))
(define x (mark-box 'name' 2 3 5))
(display (box.width x))
(newline)
(box.width-set! x 15)
(display (box.width x))
)
=> 2
=> 15
目前还暂不支持初始化操作 如这种形式:
(defstruct box (name width height(size 5)))
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。