Added (pack-lambda-arguments)

This commit is contained in:
Justin Ethier 2016-08-17 22:49:54 -04:00
parent 639d03691c
commit 55df97d215

View file

@ -22,6 +22,7 @@
lambda->formals lambda->formals
lambda-formals-type lambda-formals-type
lambda-varargs-var lambda-varargs-var
pack-lambda-arguments
;; Environments ;; Environments
env:enclosing-environment env:enclosing-environment
env:first-frame env:first-frame
@ -44,7 +45,6 @@
mangle mangle
mangle-global mangle-global
;; Scheme library functions ;; Scheme library functions
util:take
gensym gensym
delete delete
delete-duplicates delete-duplicates
@ -54,6 +54,7 @@
list-insert-at! list-insert-at!
list-prefix? list-prefix?
string-replace-all string-replace-all
take
filter) filter)
(begin (begin
@ -136,17 +137,10 @@
((args:varargs) ((args:varargs)
(list args)) (list args))
((args:fixed-with-varargs) ((args:fixed-with-varargs)
(let ((num-req-args (length/obj formals))) (let* ((num-req-args (length/obj formals))
; required - (util:take args num-req-args) (areq (take args num-req-args))
; optionals - reverse args, take remaining (aopt (list-tail args num-req-args)))
(append areq (list aopt))))
;; TODO: take required args, then take optionals
;; pack all optionals as a (possibly empty) list,
;; then append it as the last arg
;; TODO: need to be careful about performance, are doing a lot
;; of list traversals for a single function call
'TODO))
(else (else
args))) args)))
@ -159,7 +153,9 @@
(else (else
len)))) len))))
(define (util:take lis k) ; take : list -> integer -> list
; The take function from SRFI 1
(define (take lis k)
;(check-arg integer? k take) ;(check-arg integer? k take)
(let recur ((lis lis) (k k)) (let recur ((lis lis) (k k))
(if (zero? k) '() (if (zero? k) '()