前提・実現したいこと
Racketでリストと整数を与えるとリストのリストとして返す関数を書こうとしています。
動作イメージは以下の通りです。
(list->Tmatrix '(1 2 3 4 5) 3)
((1 2 3) (2 3 4) (3 4 5) (4 5 0) (5 0 0))
発生している問題・エラーメッセージ
リストの長さと同じ数のリストを得るところまで書いてみたところ、末尾再帰が止まらずにエラーが出てしまいました。デバッグツールで動作を確認したところ、list->Tmatrix-subでnが0になってもcons以下を評価しに行って、takeでのエラーメッセージが出ています。
末尾再帰の書き方が間違っているのだと思いますが、どこがおかしいのでしょうか?
take: arity mismatch; the expected number of arguments does not match the given number expected: 2 given: 1 arguments...:
該当のソースコード
scheme
1#lang racket 2(require srfi/1) 3 4(define (list->Tmatrix lst width) 5 (list->Tmatrix-sub (add-0xWidth lst width) width (length lst))) 6 7(define (add-0xWidth lst1 width1) 8 (append lst1 (make-list (- width1 1) 0))) 9 10(define (list->Tmatrix-sub lst2 width2 n) 11 (if (= n 0) 12 '() 13 (cons (take (list->Tmatrix-sub (cdr lst2) width2 (- n 1))) (take lst2 width2)))) 14 15(define x (iota 5)) 16(list->Tmatrix x 3)
試したこと
手直ししてgaucheでも動かしてみましたが同様の問題が発生しています。
...
*** ERROR: wrong number of arguments for #<closure (take list k)> (required 2, got 1)
While loading "././mytest01.scm" at line 10
Stack Trace:
0 (take (list->Tmatrix-sub (cdr x) y (- z 1)))
at "././mytest01.scm":8
1 (take (list->Tmatrix-sub (cdr x) y (- z 1)))
at "././mytest01.scm":8
2 (list->Tmatrix-sub (cdr x) y (- z 1))
at "././mytest01.scm":8
3 (take (list->Tmatrix-sub (cdr x) y (- z 1)))
at "././mytest01.scm":8
4 (list->Tmatrix-sub (cdr x) y (- z 1))
at "././mytest01.scm":8
5 (take (list->Tmatrix-sub (cdr x) y (- z 1)))
at "././mytest01.scm":8
6 (list->Tmatrix-sub (cdr x) y (- z 1))
at "././mytest01.scm":8
7 (take (list->Tmatrix-sub (cdr x) y (- z 1)))
at "././mytest01.scm":8
...
補足情報(FW/ツールのバージョンなど)
使用しているのは
racket c7.5.
DrRacket, version 7.5, Japanese
gauche 0.9.9
です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/23 07:08
2019/12/23 07:15
2019/12/23 08:09
2019/12/23 11:34
2019/12/23 15:11
2019/12/24 04:33