0

たとえば私が持っていると言う

(define sample '("a" "b" "c"))

サンプルで機能するネストされたループを作成するにはどうすればよいですか。

 (define (runthis a)
    (cond
    (char? (car a)) ;given that this condition is true I go on to the nested loop

    (define (work sample)
    <dosomething>
    (work (cdr sample))))

    (else (write " ")
(runthis(cdr a)))) 

これは基本的なネストされたループの正しいテンプレートですか?

4

3 に答える 3

3

ネストされたループが必要な場合は、代わりに for を使用することをお勧めします。これは小さくてばかげた例です。外側のループは、リスト内の単語を 1 つずつ実行します。現在の単語が r で始まる場合、内側のループは各文字を一度に 1 つずつ出力します。

#lang racket

(define (print-words-beginning-with-r words)
  (for ([word words]
        #:when (char=? (string-ref word 0) #\r))
    (for ([c word])
      (display c))
    (newline)))

(print-words-beginning-with-r '("racket" "rocks" "!"))

これは出力します

racket
rocks
于 2012-05-07T20:10:19.983 に答える
1

便利なSchemeインタープリターはありませんが、実行されるようには見えません。

「ネストされたループ」の正確な意味や、満たそうとしている要件はわかりませんが、Schemeでは、読みやすさや明瞭さに影響を与えるため、多くのネスト関数や長い関数は推奨されていません。この種の動作を再現しようとしていますか?

while(foo) {
    while(bar) {
        // Frob the fizzbits
    }
}

私はこのようなものをお勧めします。これは機能的には同等ですが、簡単に理解できます。

(define (inner-loop the-list)
  ; do things
)

(define (outer-loop the-list)
  (cond (char? (car a)) (inner-loop the-list)
        (else           (write " "))))
于 2012-05-07T16:47:47.187 に答える
1

別の可能性は、次のように、という名前letになります。

(define (runthis a)
  (cond
    ((char? (car a))
     (let loop ((sample a))
       (cond 
         ((null? sample) '())
         (else (display (car sample))
           (loop (cdr sample))))))
    (else (write " "))))
于 2012-05-07T16:57:40.580 に答える