使用中の Scheme インタプリタに応じて、必要なループを実装する方法がいくつかあります。たとえば、Racket では、反復と内包を使用するのと同じくらい簡単です。
(define (orderedTriples n)
(for* ([i (in-range n -1 -1)]
[j (in-range n -1 -1)]
[k (in-range n -1 -1)])
(printf "(~a, ~a, ~a)" i j k)))
質問に示されているプログラミングのスタイル (それが機能していると仮定) は、Scheme では強く推奨されていません。set!
ループにミューテーション (操作) を使用することは大したことではありません。C のような言語で問題を解決する方法ですが、特にScheme(および一般的なLisp)には、プログラムで反復を実装するための他の構成要素があり(たとえば、@TerjeDによって提供されるソリューションは、の使用を示していdo
ます)、そのような構成要素が存在しなくても、再帰的なソリューションまたは、高次の手順を使用したソリューションが優先されます。たとえば、ネストされたマッピングを標準の手順のみで使用する別の解決策を次に示します(ただし、printf
非標準の は例外です)。
(define (range n)
(if (negative? n)
'()
(cons n (range (- n 1)))))
(define (orderedTriples n)
(for-each (lambda (i)
(for-each (lambda (j)
(for-each (lambda (k)
(printf "(~a, ~a, ~a)" i j k))
(range n)))
(range n)))
(range n)))