Advertisement
Guest User

9, 10

a guest
Dec 9th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 3.38 KB | None | 0 0
  1. ;(use-syntax (ice-9 syncase))
  2. (define-syntax evaluate
  3.   (syntax-rules ()
  4.     ((_ list)
  5.      (eval list (interaction-environment)))))
  6. (define (set-cadr! l v)
  7.   (set-car! (cdr l) v))
  8. (define (sym<->str arg)
  9.   (if (symbol? arg)
  10.       (symbol->string arg)
  11.       (string->symbol arg)))
  12. (define (strs->sym . strings)
  13.   (sym<->str (apply string-append strings)))
  14. (define-syntax struct-getter
  15.   (syntax-rules ()
  16.     ((_ name field)
  17.      (evaluate (list 'define(list (strs->sym (sym<->str 'name) "-" (sym<->str 'field)) 'struct) '(cadr (assoc 'field (cdr struct))))))))
  18. (define-syntax struct-setter
  19.   (syntax-rules ()
  20.     ((_ name field)
  21.      (evaluate (list 'define (list (strs->sym "set-" (sym<->str 'name) "-" (sym<->str 'field) "!") 'struct 'val) '(set-cadr! (assoc 'field (cdr struct)) val))))))
  22. (define-syntax struct-getters
  23.   (syntax-rules ()
  24.     ((_ name (field))
  25.      (struct-getter name field))
  26.     ((_ name (field fields ...))
  27.      (begin
  28.        (struct-getter name field)
  29.        (struct-getters name (fields ...))))))
  30. (define-syntax struct-setters
  31.   (syntax-rules ()
  32.     ((_ name (field))
  33.      (struct-setter name field))
  34.     ((_ name (field fields ...))
  35.      (begin
  36.        (struct-setter name field)
  37.        (struct-setters name (fields ...))))))
  38. (define-syntax struct-pred
  39.   (syntax-rules ()
  40.     ((_ name)
  41.      (evaluate (list 'define (list (strs->sym (sym<->str 'name) "?") 'struct) '(and (list? struct) (symbol? (car struct)) (equal? (car struct) 'name)))))))
  42. (define-syntax struct-record
  43.   (syntax-rules ()
  44.     ((_ (field))
  45.      (list (list 'list ''field (strs->sym (sym<->str 'field) "_arg"))))
  46.     ((_ (field fields ...))
  47.      (append (list (list 'list ''field (strs->sym (sym<->str 'field) "_arg"))) (struct-record (fields ...))))
  48.     ((_ name (fields ...))
  49.      (append '('name) (struct-record (fields ...))))))
  50. (define-syntax struct-make
  51.   (syntax-rules ()
  52.     ((_ name (fields ...))
  53.      (evaluate (list 'define (list (strs->sym "make-" (sym<->str 'name)) (strs->sym (sym<->str 'fields) "_arg") ...) (append '(list) (struct-record name (fields ...))))))))
  54. (define-syntax define-struct
  55.   (syntax-rules ()
  56.     ((_ name (fields ...))
  57.      (begin
  58.        (struct-getters name (fields ...))
  59.        (struct-setters name (fields ...))
  60.        (struct-pred name)
  61.        (struct-make name (fields ...))))))
  62.  
  63. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  64.  
  65. ;(use-syntax (ice-9 syncase))
  66. (define-syntax define-data
  67.   (syntax-rules ()
  68.     ((_ type constructors)
  69.      (define-type `type `constructors))))
  70. (define (define-type type constructors)
  71.   (define (define-constructor constructor)
  72.     (eval
  73.      `(define ,constructor
  74.         (list ',(car constructor) ,@(cdr constructor)))
  75.      (interaction-environment)))
  76.   (define (define-predicate)
  77.     (eval
  78.      `(define (,(string->symbol (string-append (symbol->string type) "?")) ys)
  79.         (and (list? ys) (not (null? ys)) (assoc (car ys) ',constructors) #t))
  80.      (interaction-environment)))
  81.   (define-predicate)
  82.   (for-each
  83.    define-constructor
  84.    constructors))
  85. (define-syntax match
  86.   (syntax-rules ()
  87.     ((_ xs) #f)
  88.     ((_ xs ((shape-type args ...) expr) exprs ...)
  89.      (or (and (list? xs) (not (null? xs)) (equal? (car xs) 'shape-type) (equal? (length (cdr xs)) (length '(args ...))) (eval (cons '(lambda (args ...) expr) (cdr xs)) (interaction-environment))) (match xs exprs ...)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement