 
 (declare jl-eval)
 
-(defprotocol Zeroable
-  (zero [self]))
-
 (defprotocol Applicable
   (jl-apply [self arg]))
 

			   (jl-eval cdr env)))
  Destructurable
  (jl-destructure [self arg] (merge (jl-destructure car (:car arg))
				    (jl-destructure cdr (:cdr arg))))
  Zeroable
  (zero [self] (new pair (zero car) (zero cdr))))

(defrecord empty-list []
  JLEmptyList
  (empty-list? [self] true))

(extend-type Number
  Zeroable
  (zero [self] 0))

;;;; Syntax

  JLPrimitive
  (primitive? [self] true)
  Applicable
  (jl-apply [self arg] (implementation arg)))

(defrecord closure [formal body env]
  JLClosure
  (closure? [self] true)
  Applicable
  (jl-apply [self arg]
	    (jl-eval body (extend-env (jl-destructure formal arg) env))))

(defprotocol Evaluable
  (jl-eval [self env]))
