Skip to content

compiling define-datatype

· xieyuheng

之前说 x-lisp 之所以可以用,就在于可以用 define-data 来描述 ADT。 现在重新加回来了类型系统,就真的是 ADT 了。

scheme
(define-datatype (my-list-t E)
  nil
  (li (head E) (tail (my-list-t E))))

需要在编译时把它展开,并且生成所需要的函数和类型。

my-list-t 本身会被定义为 DatatypeDefinition,所以不用管。

scheme
;; DataConstructor

(claim nil
  (polymorphic (E)
    (my-list-t E)))

(define nil #nil)

(claim li
  (polymorphic (E)
    (-> E (my-list-t E)
        (my-list-t E))))

(define (li head tail) [#li head tail])

;; DataAccessor

(claim li-head
  (polymorphic (E)
    (-> (my-list-t E)
        E)))

(define (li-head target) (list-get 1 target))

(claim li-head
  (polymorphic (E)
    (-> (my-list-t E)
        (my-list-t E))))

(define (li-tail target) (list-get 2 target))

;; DataModifier

(claim li-put-head!
  (polymorphic (E)
    (-> E (my-list-t E)
        (my-list-t E))))

(define (li-put-head! value target) (list-put! 1 value target))

(claim li-put-tail!
  (polymorphic (E)
    (-> (my-list-t E) (my-list-t E)
        (my-list-t E))))

(define (li-put-tail! value target) (list-put! 2 value target))

(claim li-put-head
  (polymorphic (E)
    (-> E (my-list-t E)
        (my-list-t E))))

(define (li-put-head value target) (list-put 1 value target))

(claim li-put-tail
  (polymorphic (E)
    (-> (my-list-t E) (my-list-t E)
        (my-list-t E))))

(define (li-put-tail value target) (list-put 2 value target))