2016-10-02 15 views
0

リストのディレクトリとサブディレクトリを通過してファイルサイズを追加できる再帰的なソリューションを作成する必要があります。私はスキームでの経験がゼロであり、教授は私に戻っていません。私はいくつかの試みを試みましたが、それらはすべてエラーで終了します。もし誰かが私を助けることができたら、私はこの任務を理解するのに多くの時間がないので、大いに感謝します。私は関数の外let文を使用してみましたが、私は何の手掛かりかを持っていないので、それはまだ動作しませんSchemeのリストを解析し、すべての数字の合計を取得する

  Ill-formed special form: (let (...)) 

:私は、コードを実行すると、私はいつもこのエラーが出る

(define disk '("D" "main" 
(
    ("F" "file1.txt" (30)) 
    ("F" "file2.txt" (11)) 

    ("D" "sub1" 
    (
     ("F" "file1.txt" (1234)) 
     ("F" "file2.txt" (2345)) 
     ("F" "file3.txt" (3456)) 
    ) 
    ) 
    ("D" "sub2" 
    (
     ("F" "file1.txt" (1234)) 
     ("F" "file2.txt" (2345)) 
     ("F" "file3.txt" (3456)) 
    ) 
    ) 
) 
) 
) 

(define (getEnd n) 
    (let ((n 1))) 
    (let ((m 0))) 
    (member 3 '(disk.n)) 
    (+ m (getEnd (+ n 1))) 

) 

スキームが動作します。私はクラスメート達に手を差し伸べました。彼らはそれを理解することもできません。

ご協力いただきありがとうございます。

+0

私たちが 'let'を使う方法ではない - 構文が正しくない –

+0

このコードはSchemeコードよりもCコードに似ています。 –

答えて

0

letは、ボディまたはフォーム中に存在するローカルバインド変数です。つまり:あなたがタグのJava、Cの方言を持っているので

(let ((n 1))   ; bind one variable 1 
    (display (+ n n)) ; use n for something 
)     ; end of let. `n` no longer exist. 

、それはこれと同じです:あなたのコードで

{ 
    int n = 1; 
    System.out.println(n + n); // use n for something 
} 
// end of block. n no longer exist 

あなたはバインディングを使用して何の表情を持っていないし、それはそれを許可された場合このように、デッドコードされているでしょう:

{ 
    int n = 1; 
} 
// end of block. n no longer exist 

コード(member 3 '(disk.n))は常に#f以来01ですは一つのシンボル、disk.n(equal? 3 'disk.n) ; ==> #f

(+ m (getEnd (+ n 1))nを増やすことで無条件再帰を行い、最後の行を持つリストです。構造体からの数値は合計されません。

(define (file? lst) 
    ; todo: implement 
) 

(file? '("F" "file1.txt" (1234))) ; ==> #t 
(file? '("D"())     ; ==> #f 
:このようにあなたが作ることができる「F」または「D」のいずれかであるリストは、最初の要素を見ることによって、ファイルまたはディレクトリであるかどうかをチェックすることができそうです

質問

あなたはのサイズを取得する手続きを行うことができます

(define (directory-elements dir) 
    ; todo: implement 
) 

(directory-elements '("D" "D" (("F" "F1" (1234)) ("F" "F2" (2345))))) 
; ==> (("F" "F1" (1234)) ("F" "F2" (2345))) 

あなたは、ディレクトリの3番目の要素をチェックしてファイルのリストを取得することができますファイル:あなたがdirectory-elements-sizeが欠落している

(define (size file-or-dir) 
    (if (file? file-or-dir) 
     (file-size file-or-dir) 
     (directory-elements-size (directory-elements file-or-dir))) 

(size '("F" "F1" (1234))) ; ==> 1234 
(size '("D" "D" (("F" "F1" (1234)) ("F" "F2" (2345))))) ; ==> 3579 

(define (file-size file) 
    ; todo: implement 
) 

(file-size '("F" "F1" (1234))) 
; ==> 1234 

今、あなたは上記のものを使用して、ターゲットの手続きを行うことができます。それは再帰で作ることができます:

(define (directory-elements-size lst) 
    (if (null? lst) 
     <???>         ; size of an empty directory 
     (+ (size <????>)      ; add the size of first file/dir 
     (directory-elements-size <????>)))) ; with the size of the rest of the elements 

あなたは行き​​ます。あなたはあなたを得るために十分以上のものが必要です。

関連する問題