;; -*- Mode: Irken -*-
;; lisp 'association list' - keyed by symbol
(include "lib/core.scm")
(datatype alist
(:nil)
(:entry 'a 'b (alist 'a 'b))
)
(define lookup
(alist:nil) k -> (maybe:no)
(alist:entry k0 v0 tl) k -> (if (eq? k0 k)
(maybe:yes v0)
(lookup tl k))
)
;; ok, here's how you would have to build a table without a macro facility:
(define numbers
(alist:entry
0 'zero
(alist:entry
1 'one
(alist:entry
2 'two
(alist:entry
3 'three
(alist:entry
4 'four
(alist:entry
5 'five
(alist:entry
6 'six
(alist:entry
7 'seven
(alist:entry
8 'eight
(alist:entry
9 'nine
(alist:nil))))))))))))
(printn (lookup numbers 6))
;; here's a macro that makes it much cleaner:
(defmacro make-alist
(make-alist) -> (alist:nil)
(make-alist (k0 v0) (k1 v1) ...) -> (alist:entry k0 v0 (make-alist (k1 v1) ...))
)
;; sample usage:
(define numbers2
(make-alist
(0 'zero)
(1 'one)
(2 'two)
(3 'three)
(4 'four)
(5 'five)
(6 'six)
(7 'seven)
(8 'eight)
(9 'nine)
))
(printn (lookup numbers2 7))
(printn (lookup numbers2 100))