95 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2008 James Cash
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: lisp lisp.parser tools.test sequences math kernel parser arrays lists
 | |
| quotations ;
 | |
| 
 | |
| IN: lisp.test
 | |
| 
 | |
| : define-lisp-builtins (  --  )    
 | |
|    init-env
 | |
|     
 | |
|     f "#f" lisp-define
 | |
|     t "#t" lisp-define
 | |
|     
 | |
|     "+" "math" "+" define-primitive
 | |
|     "-" "math" "-" define-primitive
 | |
|     "<" "math" "<" define-primitive
 | |
|     ">" "math" ">" define-primitive
 | |
|     
 | |
|     "cons" "lists" "cons" define-primitive
 | |
|     "car" "lists" "car" define-primitive
 | |
|     "cdr" "lists" "cdr" define-primitive
 | |
|     "append" "lists" "lappend" define-primitive
 | |
|     "nil" "lists" "nil" define-primitive
 | |
|     "nil?" "lists" "nil?" define-primitive
 | |
|     
 | |
|     "define" "lisp" "defun" define-primitive
 | |
|     
 | |
|     "(lambda (&rest xs) xs)" lisp-string>factor "list" lisp-define
 | |
|    ;     
 | |
|     
 | |
| [
 | |
|     define-lisp-builtins
 | |
|     
 | |
|     { 5 } [
 | |
|         "(+ 2 3)" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { 8.3 } [
 | |
|         "(- 10.4 2.1)" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { 3 } [
 | |
|         "((lambda (x y) (+ x y)) 1 2)" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { 42 } [
 | |
|         "((lambda (x y z) (+ x (- y z))) 40 3 1)" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { "b" } [
 | |
|         "(cond (#f \"a\") (#t \"b\"))" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { "b" } [
 | |
|         "(cond ((< 1 2) \"b\") (#t \"a\"))" lisp-eval
 | |
|     ] unit-test
 | |
|         
 | |
|     { +nil+ } [
 | |
|         "(list)" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { { 1 2 3 4 5 } } [
 | |
|         "(list 1 2 3 4 5)" lisp-eval list>seq
 | |
|     ] unit-test
 | |
|     
 | |
|     { { 1 2 { 3 { 4 } 5 } } } [
 | |
|         "(list 1 2 (list 3 (list 4) 5))" lisp-eval cons>seq
 | |
|     ] unit-test
 | |
|     
 | |
|     { 5 } [
 | |
|         "(begin (+ 1 4))" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { 5 } [
 | |
|         "(begin (+ 5 6) (+ 1 4))" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { T{ lisp-symbol f "if" } } [
 | |
|         "(defmacro if (pred tr fl) (list (quote cond) (list pred tr) (list (quote #t) fl)))" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
|     { t } [
 | |
|         T{ lisp-symbol f "if" } lisp-macro?
 | |
|     ] unit-test
 | |
|     
 | |
|     { 1 } [
 | |
|         "(if #t 1 2)" lisp-eval
 | |
|     ] unit-test
 | |
|     
 | |
| !     { 3 } [
 | |
| !         "((lambda (x) (if x (+ 1 2) (- 3 5))) #t)" lisp-eval
 | |
| !     ] unit-test
 | |
|     
 | |
| ] with-interactive-vocabs
 |