======interlacep.scm======
<code shell>#!/usr/bin/env racket
#lang racket
</code>
2. Naprogramujte predikát interlaced?, který vrací #t, pokud je jeho argument seznam liché délky (nebo je prázdný)
a prvky na sudých pozicích jsou si rovny.
Predikát vlastně zjištuje, jestli seznam mohl vzniknout použitím procedury interlace z předchozího příkladu.
<code scheme>
(define (interlace l x)
(if (or (null? l) (null? (cdr l)))
l;'() nebo (?): hotovo
(foldr
(lambda (e t) (cons e (cons x t)))
(cons (car l) '());(car l) nestaci, lze i `(,(car l))
(cdr l))))
(interlace '() 'x)
(interlace '(1) 'x)
(interlace '(1 2) 'x)
(interlace '(1 2 3) 'x)
</code>
predikat pro následujíci tvar: '(x ? x ? ... x ?)
<code scheme>
(define (x? x l)
(cond ((null? l) #t)
((null? (cdr l)) #f) ;delka 1
((equal? x (car l)) (x? x (cddr l)));ukousneme 2 a ocasni rekurze
(else #f)))
(x? 'x '()) ;#t
(x? 'x '(x)) ;#f
(x? 'x '(x 1)) ;#t
(x? 'x '(x 1 x 2 x)) ;#f
(x? 'x '(x 1 x 2 x 3)) ;#t
(x? 'x '(x 1 x 2 y 3 y 4)) ;#f
'(#t #f #t #f #t #f (testujeme x?))
(map (lambda (l) (x? 'x l)) '(() (x) (x 1) (x 1 x 2 x) (x 1 x 2 x 3) (x 1 x 2 y 3 y 4)))
</code>
interlaced? je varianta na x?
<code scheme>
(define (interlaced? l)
(or (null? l)
(null? (cdr l)) ;'() a (?) jsou #t
(x? (cadr l) (cdr l)) ;x? inline jako named let? letrec?
))
</code>
Příklady použití:
<code scheme>
(interlaced? '()) ;⇒ #t
(interlaced? (list 1)) ;⇒ #t
(interlaced? (interlace (list 1 2 3) 'x)) ;⇒ #t
(interlaced? '(1 x 2 x)) ;⇒ #f
(interlaced? '(x 1 x 2 x)) ;⇒ #f
(interlaced? '(x x x)) ;⇒ #t
'(qq:)
(define test1 `(() ,(list 1) ,(interlace (list 1 2 3) 'x) (1 x 2 x) (x 1 x 2 x) (x x x)))
test1
'(#t #t #t #f #f #t (testujeme interlaced?))
(map interlaced? test1)
; vim: syntax=racket
</code>