Основным инструментом, который вы хотите использовать для получения таких вещей в Racket, являются различные циклы for
. Предполагая, что вы хотите создать матричную структуру на основе списка, это можно получить одним из следующих способов:
#lang racket
(define (foo x y)
(for/list ([i y])
(for/list ([j x])
(list (add1 i) (add1 j)))))
И поскольку люди подняли более общий вопрос о том, как заставить foo
создать матрицу любого измерения, вот обобщенная версия, которая работает с любым количеством аргументов и по-прежнему возвращает тот же результат, когда вызывается как (foo 3 2)
:
#lang racket
(define (foo . xs)
(let loop ([xs (reverse xs)] [r '()])
(if (null? xs)
(reverse r)
(for/list ([i (car xs)])
(loop (cdr xs) (cons (add1 i) r))))))
(Обратите внимание, что в обоих случаях я использовал простую итерацию, основанную на 0, и использовал add1
, чтобы получить нужные числа. Альтернативным способом было бы заменить
(for/list ([i x]) ... (add1 i) ...)
с
(for/list ([i (in-range 1 (add1 x)]) ... i ...)
)