Схема переменной арности

(define test (lambda args 
  (if (= (length args) 1) (display (car args))
      (begin (display (car args))
      (test (cdr args))))))

Я искал его в сети и не нашел ответа, я смог получить переменное число аргументов для моего функционала, но как мне передать их не как один список в следующую итерацию?

Чтобы быть более понятным, если я позвоню:

(test (list 1 1) (list 2 2) (list 3 3))

я собирался получить:

(1 1) (2 2) (3 3)

но я получаю:

(1 1) ((2 2) (3 3))

Заранее спасибо!

2 ответа

Решение

args будет список аргументов, переданных test, В первый раз вы передадите ему три списка, так args будет список этих трех списков. Вы проходите это рекурсивно (cdr args), который является списком последних двух списков, так что теперь args является списком, содержащим список, который имеет последние два списка. То есть, args является (((2 2) (3 3))) где вы хотите ((2 2) (3 3)), Вы можете исправить это, применив test функция к списку:

(apply test (cdr args))

Который, если (cdr args) является ((2 2) (3 3)), так же, как делать:

(test (2 2) (3 3))
(define (test . args)
  (if (= (length args) 1)
    (display (car args))
    (begin
      (display (car args))
      (apply test (cdr args)))))
Другие вопросы по тегам