;; -*- 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))