sorting - strange behavior of sort in racket -


i have following defined:

    (struct type (parent dirty) #:mutable #:transparent)     (define types (make-hash))      (define (add-key predicate parent)       (begin         (hash-ref! types parent (type empty #t)) ;;if parent doesn't exist, created no parent.         (let([node (hash-ref types predicate #f)])           (if(or (boolean? node)   ;;the node not on list                  (not(equal? (type-parent node) parent))) ;;the node has different parent              (hash-set! types predicate (type parent #t))              (printf "nothing do\n")              ))))      (define (ancestor? predicate1 predicate2)       (let ([node (hash-ref types predicate2 #f)])         (cond [(false? node)(error "following predicate not in types: " predicate2)]               [(empty? (type-parent node)) #f]               [(equal? (type-parent node) predicate1) #t]               [else (ancestor? predicate1 (type-parent node))]))) 

it seems work great, , can stuff like:

    > (ancestor? integer? even?)     #t     > (ancestor? list? even?)     #f     > (ancestor? integer? odd?)     #t     >  

i seem have issue sort (sort '(integer? odd? number? list? even?) ancestor?) throws following error: following predicate not in types: integer? is, of course, defined in implementation. thing sure key-value pair exists, can manipulate it, can manually run every line of code of ancestor... i'am puzzled causing this... idea?

  1. i took code as-is , dropped in file.

  2. added trace line ancestor?: either add first line (displayln `(ancestor? ,predicate1 ,predicate2)) or add (trace ancestor?) (after (require racket/trace)).

  3. this shows offending call broken in code: (ancestor? 'odd? 'integer?) leads exact error.

(i have no idea code doing: idea it's easy derive problem mechanically.)


Comments

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -