Схема переменной арности
(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)))))