Way to explode list into arguments?

2019-07-18 04:55发布

问题:

Assume I have a procedure upto that when called like (upto 1 10) will generate the list '(1 2 3 4 5 6 7 8 9 10).

If I want to use this list as arguments to a function like lcm that takes multiple arguments rather than a single list, like (lcm 1 2 3 4 5 6 7 8 9 10) is there a way to do this?

回答1:

Use apply: e.g

(apply lcm (upto 1 10))

"apply" applies a function to a list of arguments.



回答2:

One way I found to do this using eval is the following:

(eval (cons 'lcm (upto 1 10)))



回答3:

In MIT-Scheme (unsure of others) you can use the dot in your function definition.

(define (func-with-multiple-args . args)
  (let loop ((args args))
    (if (null? args)
      'done
      (begin (display (car args)) (loop (cdr args))))))

Calling with

(func-with-multiple-args 1 2 3 4)

will do the job. Note that the args get put into a list.

Fun fact: the `list' procedure is actually defined in list.scm of the MIT-Scheme "runtime" source as:

(define (list . args)
 args)


标签: scheme