Way to explode list into arguments?

2019-07-18 04:19发布

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?

标签: scheme
3条回答
劳资没心,怎么记你
2楼-- · 2019-07-18 04:46

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

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

查看更多
看我几分像从前
3楼-- · 2019-07-18 04:53

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)
查看更多
神经病院院长
4楼-- · 2019-07-18 04:59

Use apply: e.g

(apply lcm (upto 1 10))

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

查看更多
登录 后发表回答