1

リストの最後の要素を最初に切り替える関数を書いていました:

(define last-elem
    (lambda (l)
        (car (reverse l))))

(define all-but-last
    (lambda (l) 
            (reverse (cdr (reverse l)))))


(define (last-to-first x) (append (list last-elem x) (all-but-last x)))

(last-to-first '(1 2 3 4 5 6))

それはうまくいきませんでした、そして私はその理由を知っていました。ブラケットを付けるのを忘れていましたlist last-elem x

問題は、間違って入力されたコードの出力に興味があったということです。

(#<Closure> (1 2 3 4 5 6) 1 2 3 4 5)

これだとどういう意味ですか?どうやってこれになったのですか?

4

3 に答える 3

0

Scheme では、すべての識別子は構文キーワード (「トランスフォーマー」にバインド) または変数 (値にバインド) のいずれかを表します。コードlast-elemでは、定義した関数にバインドされた変数を示します。あなたが書くとき:

(list last-elem x)

インタプリタ/コンパイラは と の値を持つリストを生成しlast-elemますx。したがって、#<Closure>リストの結果。

于 2013-03-17T16:48:53.673 に答える
0
(list last-elem x)

関数を呼び出しませんlast-elemlast-elem変数の値(プロシージャ) と引数の値の 2 つの要素のリストを返すだけですx。あなたがしたい:

(list (last-elem x))

しかし、そもそもリストを作成する理由はありません。試す:

(define (last-to-first x)
  (cons (last-elem x) (all-but-last x)))
于 2013-03-17T08:42:08.570 に答える