--- /dev/null
+(define cond
+ (operative cases env
+ (define cond-internal
+ (wrap (operative (cases-list) _
+ (if (= cases-list nil)
+ nil
+ (if (evaluate (car (car cases-list)) env)
+ (evaluate (car (cdr (car cases-list))) env)
+ (cond-internal (cdr cases-list)))))))
+ (cond-internal cases)))
+
+(define cons-list-zip
+ (wrap (operative (left right) _
+ (cond ((and (= left nil) (= right nil)) nil)
+ ((= left nil) (assert false))
+ ((= right nil) (assert false))
+ (true (cons (cons (car left) (car right))
+ (cons-list-zip (cdr left) (cdr right))))))))
+
+# Maybe environments should have been association lists
+(define merge-association-list-with-cons-dict
+ (wrap (operative (a-list cons-dict) _
+ (if (= a-list nil)
+ cons-dict
+ (merge-association-list-with-cons-dict
+ (cdr a-list)
+ (cons-dict-set cons-dict (car (car a-list)) (cdr (car a-list))))))))
+
+(define cons-list-map
+ (wrap (operative (f xs) _
+ (if (= xs nil)
+ nil
+ (cons (f (car xs)) (cons-list-map f (cdr xs)))))))
+
+(define function
+ (operative outer-args outer-env
+ (define arg-binding (car outer-args))
+ (define function-body (cdr outer-args))
+
+ (define initial-function-env (cons-dict-set nil :__parent__ outer-env))
+
+ (wrap (operative inner-args inner-env
+ (define function-env
+ (cond ((identifier? arg-binding) (cons-dict-set initial-function-env
+ (identifier->symbol arg-binding)
+ inner-args))
+ ((cons-list? arg-binding) (merge-association-list-with-cons-dict (cons-list-zip (cons-list-map identifier->symbol arg-binding) inner-args)
+ initial-function-env))
+ (true (assert "Must be an identifier or a cons-list" false))))
+ (evaluate-expressions function-body function-env)))))
+
+(define and (operative (left right) env
+ (if (evaluate left env)
+ (evaluate right env)
+ false)))
+
+(define or (operative (left right) env
+ (if (evaluate left env)
+ true
+ (evaluate right env))))
+
+(define quote (operative (quoted-expression) _ quoted-expression))
+
+(define nil? (operative (expression) env
+ (= (evaluate expression env) nil)))
+
+(define get-current-environment
+ (wrap (operative () env env)))
+
+(define cons-list
+ (wrap (operative items _ items)))