2013-06-23 1 views
1

Я пытаюсь написать функцию предиката, которая возвращает TRUE, когда список определен как застежка-молния. Застежка-молния определяется как правильный список, где каждый элемент представляет собой список с ровно двумя элементами и может быть любым выражением.Функция предиката функции zipper

Примером является

(zipper? '((a 1)(b 2))) 
#t 
(zipper? '((a (1)) ((b) 2))) 
#t 
(zipper? '((a 1 2)(b 1))) 
#f 

Я пытался сначала проверить, если список аргументов полностью и вернуться ложным, а затем проверить автомобиль список его длины элементов, и передать корд из списка назад хотя моя функция, но у меня проблемы с ее запуском.

(define (zipper? l) 
    (if (empty? l) 
    #f 
    (if (> 1 (length car(l))) 
    #t 
    (zipper? (cdr (l)))))) 

любая идея, что я делаю неправильно, и как я могу это исправить? Я все еще изучаю схему.

+1

«список Ассоциации» название этой структуры данных , [Zipper] (http://en.wikipedia.org/wiki/Zipper_ (data_structure)) - это другой зверь. –

ответ

2

В этом случае, лучше использовать cond, чем ряд вложенных if с, они причиняют вам неприятности. И это хорошая идея, чтобы извлечь предикат, который проверяет, является ли текущий элемент «zip» в отдельной процедуре. Что-то вроде этого:

(define (zip? e) 
    (and (list? e) 
     (= (length e) 2))) 

(define (zipper? lst) 
    (cond ((null? lst) #t) 
     ((not (zip? (car lst))) #f) 
     (else (zipper? (cdr lst))))) 

Конечно, есть несколько других способов решения этой проблемы. Например, используя логические разъемы вместо условных:

(define (zipper? lst) 
    (or (null? lst) 
     (and (zip? (car lst)) 
      (zipper? (cdr lst))))) 

Или с помощью Ракетки-х andmap (если нет в наличии, использование SRFI-1-х every):

(define (zipper? lst) 
    (andmap zip? lst)) 
+0

Удивительное спасибо, схема намного более гибкая, чем я думал раньше. – Yoink

1

ваша скобка неверна

(define (zipper? l) 
    (if (empty? l) 
    #f 
    (if (> 1 (length (car l))) 
    #t 
    (zipper? (cdr l)))))) 

Функция всегда первый элемент в выражении, остальные аргументы. И это не совсем соответствует спецификации

(define (zipper? l) 
    (if (empty? l) 
    #t 
    (if (not (= 2 (length (car l)))) 
     #f 
     (zipper? (cdr l)))))) 
+2

Отступ?! ....? :) –