Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.08 KB | None | 0 0
  1. (use-syntax (ice-9 syncase))
  2. (define-syntax meval
  3.   (syntax-rules ()
  4.   ((_ list) (eval list (interaction-environment)))))
  5. (define (set-cadr! l v)
  6.   (set-car! (cdr l) v))
  7. (define (s->s arg)
  8.   (if (symbol? arg)
  9.       (symbol->string arg)
  10.       (string->symbol arg)))
  11. (define (strs->sym . strings)
  12.   (s->s (apply string-append strings)))
  13. (define-syntax gen-getter
  14.   (syntax-rules ()
  15.     ((_ name field) (meval (list 'define (list (strs->sym (s->s 'name) "-" (s->s 'field)) 'struct) '(cadr (assoc 'field (cdr struct))))))))
  16. (define-syntax gen-setter
  17.   (syntax-rules ()
  18.     ((_ name field) (meval (list 'define (list (strs->sym "set-" (s->s 'name) "-" (s->s 'field) "!") 'struct 'val) '(set-cadr! (assoc 'field (cdr struct)) val))))))
  19. (define-syntax gen-getters
  20.   (syntax-rules ()
  21.     ((_ name (field)) (gen-getter name field))
  22.     ((_ name (field fields ...)) (begin (gen-getter name field) (gen-getters name (fields ...))))))
  23. (define-syntax gen-setters
  24.   (syntax-rules ()
  25.     ((_ name (field)) (gen-setter name field))
  26.     ((_ name (field fields ...)) (begin (gen-setter name field) (gen-setters name (fields ...))))))
  27. (define-syntax gen-pred
  28.   (syntax-rules ()
  29.     ((_ name) (meval (list 'define (list (strs->sym (s->s 'name) "?") 'struct) '(and (list? struct) (symbol? (car struct)) (equal? (car struct) 'name)))))))
  30. (define-syntax gen-record
  31.   (syntax-rules ()
  32.     ((_ (field)) (list (list 'list ''field (strs->sym (s->s 'field) "_arg"))))
  33.     ((_ (field fields ...)) (append (list (list 'list ''field (strs->sym (s->s 'field) "_arg"))) (gen-record (fields ...))))
  34.     ((_ name (fields ...)) (append '('name) (gen-record (fields ...))))))
  35. (define-syntax gen-make
  36.   (syntax-rules ()
  37.     ((_ name (fields ...)) (meval (list 'define (list (strs->sym "make-" (s->s 'name)) (strs->sym (s->s 'fields) "_arg") ...) (append '(list) (gen-record name (fields ...))))))))
  38. (define-syntax define-struct
  39.   (syntax-rules ()
  40.     ((_ name (fields ...))
  41.      (begin
  42.        (gen-getters name (fields ...))
  43.        (gen-setters name (fields ...))
  44.        (gen-pred name)
  45.        (gen-make name (fields ...))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement