2016-09-30 4 views
1

меня просят интерпретировать следующий код:схема функции фильтра код означает

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

и решение «filter возвращает элементы e в l где (p e) является #t» , но я не совсем уверен, что третий line делает. это #t, говорящее, что мы всегда принимаем это условие? Также как «пусть» работает в этом случае?

+0

использовать стандартный отступ - разбить свои выражения и поместить каждое подвыражение в свою линию, чтобы оно стало ясным. - Случай #t: да, это правда, поэтому он преуспевает, и предложение выполняется - если не было выбрано положение выше него. –

+0

@WillNess спасибо! что сделало его более ясным. – greenteam

+0

@WillNess Если это так, при редактировании вопроса, в дополнение к возврату кода, который должен быть неверно отформатирован, может также иметь смысл отредактировать его, чтобы также спросить о правильном форматировании, чтобы ответ имел смысл. –

ответ

3

Это отформатирован немного странно, но Cond здесь функционирует как выражение матча с Haskell или ML, как это:

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

Cond принимает пар (? Казнить-это-выполнить), поэтому она должна читать далее как этот

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

Так #t -> это сделать другие вещи случае по умолчанию, потому что он всегда выполняется, если список не пуст, что бы вызвать (нуль л?). Поэтому он должен быть последним.

Смежные вопросы