Implement apply with multiple arguments.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 29 Oct 2016 14:35:44 +0000 (16:35 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 12 Dec 2016 19:33:49 +0000 (20:33 +0100)
* module/mes/base-0.mes (apply): Handle multiple arguments.
* tests/base.test: (apply, apply 1, apply 2): New test.

module/mes/base-0.mes
tests/base.test

index 454851008f90611a4752350cae37fc19d4a3bb6b..6eac6843d32161977a580462f61c3ab6a299f676 100644 (file)
@@ -26,7 +26,7 @@
 
 ;;; Code:
 
 
 ;;; Code:
 
-(define (apply f x) (apply-env f x (current-module)))
+;;(define (apply f x) (apply-env f x (current-module)))
 (define (primitive-eval e) (eval e (current-module)))
 (define (expand-macro e) (expand-macro-env e (current-module)))
 
 (define (primitive-eval e) (eval e (current-module)))
 (define (expand-macro e) (expand-macro-env e (current-module)))
 
         (cons (car rest) (loop (cdr rest)))))
   (loop (cons x rest)))
 
         (cons (car rest) (loop (cdr rest)))))
   (loop (cons x rest)))
 
+(define (apply f h . t) (apply-env f (cons h t) (current-module)))
+(define (apply f h . t)
+  (if (null? t) (apply-env f h (current-module))
+      (apply f (apply cons* (cons h t)))))
+
 (define-macro (cond . clauses)
   (list 'if (null? clauses) *unspecified*
         (if (null? (cdr clauses))
 (define-macro (cond . clauses)
   (list 'if (null? clauses) *unspecified*
         (if (null? (cdr clauses))
index b6abe22c5f90724c81201bf4a0b260c396b776d2..6c32f2115c557c00cdc6f6e8d7c0e171c79c4e59 100755 (executable)
@@ -65,4 +65,8 @@ exit $?
 (pass-if "let 2" (seq? (let ((x 0)) x) 0))
 (pass-if "let 3" (seq? (let ((p 5) (q 6)) (+ p q)) 11))
 
 (pass-if "let 2" (seq? (let ((x 0)) x) 0))
 (pass-if "let 3" (seq? (let ((p 5) (q 6)) (+ p q)) 11))
 
+(pass-if "apply" (sequal? (apply list '(1)) '(1)))
+(pass-if "apply 2" (sequal? (apply list 1 '(2)) '(1 2)))
+(pass-if "apply 3" (sequal? (apply list 1 2 '(3)) '(1 2 3)))
+
 (result 'report)
 (result 'report)