X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=code%2Frefunctionalizing_zippers.rkt;h=477daea9f27e1d47bacd3ed84efcef0a53c396ff;hp=3b51ce99358002a10e369070c23b118e73095a4b;hb=8cd2e41084d42df6db49d6ea9e3183c709a54837;hpb=d9004b22cadc93727953684bae98abcca4996401 diff --git a/code/refunctionalizing_zippers.rkt b/code/refunctionalizing_zippers.rkt index 3b51ce99..477daea9 100644 --- a/code/refunctionalizing_zippers.rkt +++ b/code/refunctionalizing_zippers.rkt @@ -17,19 +17,26 @@ [else (tz1 (pair (cons (nextchar z) (saved z)) (rest z)))])) ; using explicit continuations -(define (tc1 l k) +(define (tc0 l k) (cond [(null? l) (reverse (k '()))] + [(eqv? #\S (car l)) (tc0 (cdr l) (compose k k))] + [else (tc0 (cdr l) (lambda (tail) (cons (car l) (k tail))))])) + +; improvement: if we flip the order of cons and k in the last line, we can avoid the need to reverse +(define (tc1 l k) + (cond + [(null? l) (k '())] [(eqv? #\S (car l)) (tc1 (cdr l) (compose k k))] - [else (tc1 (cdr l) (lambda (tail) (cons (car l) (k tail))))])) + [else (tc1 (cdr l) (lambda (tail) (k (cons (car l) tail))))])) ; using implicit continuations (reset/shift) (define (tr1 l) (shift k (cond - [(null? l) (reverse (k '()))] + [(null? l) (k '())] [(eqv? #\S (car l)) ((compose k k) (tr1 (cdr l)))] - [else ((lambda (tail) (cons (car l) (k tail))) (tr1 (cdr l)))]))) + [else ((lambda (tail) (k (cons (car l) tail))) (tr1 (cdr l)))]))) ; wrapper functions, there's a (test) function at the end @@ -59,23 +66,23 @@ [else (tz3 (pair (cons (nextchar z) (saved z)) (rest z)))])) ; using explicit continuations -; there are several working solutions -; but it's a bit tricky to get the reverses in the right place, and the order of appending right (define (tc3 l k) (cond - [(null? l) (reverse (k '()))] - [(eqv? #\# (car l)) (append (reverse (k '())) (tc3 (cdr l) identity))] + [(null? l) (k '())] + ; [(eqv? #\# (car l)) (append (k '()) (tc3 (cdr l) identity))] + [(eqv? #\# (car l)) (k (tc3 (cdr l) identity))] [(eqv? #\S (car l)) (tc3 (cdr l) (compose k k))] - [else (tc3 (cdr l) (lambda (tail) (cons (car l) (k tail))))])) + [else (tc3 (cdr l) (lambda (tail) (k (cons (car l) tail))))])) ; using implicit continuations (reset/shift) (define (tr3 l) (shift k (cond - [(null? l) (reverse (k '()))] - [(eqv? #\# (car l)) (append (reverse (k '())) (reset (tr3 (cdr l))))] + [(null? l) (identity (k '()))] + ; [(eqv? #\# (car l)) (append (k '()) (reset (tr3 (cdr l))))] + [(eqv? #\# (car l)) (k (reset (tr3 (cdr l))))] [(eqv? #\S (car l)) ((compose k k) (tr3 (cdr l)))] - [else ((lambda (tail) (cons (car l) (k tail))) (tr3 (cdr l)))]))) + [else ((lambda (tail) (k (cons (car l) tail))) (tr3 (cdr l)))]))) (define (tz4 s) (list->string (tz3 (cons '() (string->list s))))) @@ -93,9 +100,11 @@ (equal? (t1 inp) (t2 inp))) (and (equal? (tz2 "abSd") "ababd") + (cmp (lambda (s) (list->string (tc0 (string->list s) identity))) tz2 "abSd") (cmp tc2 tz2 "abSd") (cmp tr2 tz2 "abSd") (equal? (tz2 "aSbS") "aabaab") + (cmp (lambda (s) (list->string (tc0 (string->list s) identity))) tz2 "aSbS") (cmp tc2 tz2 "aSbS") (cmp tr2 tz2 "aSbS") (equal? (tz4 "ab#ceSfSd") "abcecefcecefd")