;;; $Id: count-sym-exp-mod.scm,v 1.1 2006/01/04 07:00:55 leavens Exp $ (module count-sym-exp-mod (lib "typedscm.ss" "typedscm") (provide count-sym-exp count-slist) ;; Examples: ;; (count-sym-exp 'a (parse-sym-exp 'a)) ==> 1 ;; (count-sym-exp 'a (parse-sym-exp 'b)) ==> 0 ;; (count-sym-exp 'x (parse-sym-exp '(x y (x)))) ==> 2 ;; (count-sym-exp 'x (parse-sym-exp '(y (x)))) ==> 1 ;; Grammar: ;; ::= | ;; ::= ( {}* ) (require (lib "sym-exp-cooked.scm" "lib342")) (deftype count-sym-exp (-> (symbol sym-exp) number)) (define count-sym-exp (lambda (sym symexp) (if (sym-exp-symbol? symexp) (if (eq? sym (sym-exp->symbol symexp)) 1 0) (count-slist sym (sym-exp->s-list symexp))))) ;; Examples: ;; (count-slist 'x (parse-s-list '())) ==> 0 ;; (count-slist 'x (parse-s-list '(x y (x)))) ==> 2 ;; (count-slist 'x (parse-s-list '(y (x)))) ==> 1 (deftype count-slist (-> (symbol (list-of sym-exp)) number)) (define count-slist (lambda (sym slist) (if (null? slist) 0 (+ (count-sym-exp sym (car slist)) (count-slist sym (cdr slist)))))) ) ;; end module