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