2016-09-30 3 views
1

ich gefragt werde, den folgenden Code zu interpretieren:Schema Filterfunktion Code Bedeutung

(define (filter p l) 
    (cond 
     ((null? l) ’()) 
     (#t (let ((result (filter p (cdr l)))) 
      (if (p (car l)) 
       (cons (car l) result) 
       result))))) 

und die Lösung ist „filter kehrt Elemente e in l wo (p e) ist #t“ aber ich bin nicht wirklich sicher, was die dritte Linie macht. ist das #t sagend, dass wir immer diese Bedingung annehmen? Wie funktioniert das "Let" in diesem Fall?

+0

Verwenden Sie die Standardeinrückung - zerlegen Sie Ihre Ausdrücke und setzen Sie jeden Unterausdruck in eine eigene Zeile, damit es klar wird. - #t case: Ja, es stimmt, also ist es erfolgreich und die Klausel wird ausgeführt - es sei denn, eine darüber liegende Klausel wurde gewählt. –

+0

@WillNess danke! Das hat es klarer gemacht. – greenteam

+0

@WillNess Wenn dies der Fall ist, kann es beim Editieren der Frage zusätzlich zum Zurücksetzen des Codes, der falsch formatiert werden soll, auch sinnvoll sein, ihn zu bearbeiten, um auch nach der richtigen Formatierung zu fragen, damit die Antwort sinnvoll ist. –

Antwort

3

Es ist ein bisschen komisch formatiert wird, aber cond ist hier als Spiel Ausdruck von Haskell oder ML wie folgt funktionieren:

match l with 
| [] -> [] 
| x :: xs -> 
    let result = filter p xs in 
    (if p x then 
     x :: result 
    else 
     result 
    ) 

Cond Paare (? Execute-dies-Execute) hat, so sollte es weitere Informationen wie diese

(cond 
    ((null? l) ’()) 
    (#t   (let ((result (filter p (cdr l)))) 
       (if (p (car l)) 
        (cons (car l) result) ;; then 
        result) ;; else 
       ))) 

So #t -> tun dies andere Sachen ist der Standardfall, weil es führt immer, wenn die Liste nicht leer war, was auslösen würde (null l?). Deshalb muss es das Letzte sein.