[ create a new paste ] login | about

Link: http://codepad.org/qNiI3O3Y    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Jun 8:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; balanced delimiters

(define (balanced? str)
  (let ((starters '(#\( #\[ #\{)) (enders '(#\) #\] #\})))
    (let loop ((cs (string->list str)) (xs (list)))
      (cond ((null? cs) (null? xs)) ; #t if stack is empty, or #f
            ((member (car cs) starters) ; push starter on stack
              (loop (cdr cs) (cons (car cs) xs)))
            ((member (car cs) enders) ; pop matching ender from stack, or #f
              (and (pair? xs)
                   (or (and (char=? (car xs) #\() (char=? (car cs) #\)))
                       (and (char=? (car xs) #\[) (char=? (car cs) #\]))
                       (and (char=? (car xs) #\{) (char=? (car cs) #\})))
                   (loop (cdr cs) (cdr xs))))
            (else (loop (cdr cs) xs)))))) ; neither starter nor ender

(display (map balanced?
  '("{}" "[]" "()" "a(b)c" "abc[d]" "a(b)c{d[e]}" ; these work
    "{]" "(]" "a(b]c" "abc[d}" "a(b)c{d[e}]"))) ; these don't


Output:
1
(#t #t #t #t #t #t #f #f #f #f #f)


Create a new paste based on this one


Comments: