球拍中的奇怪行为

Posted

技术标签:

【中文标题】球拍中的奇怪行为【英文标题】:strange behavior of sort in racket 【发布时间】:2013-05-10 12:49:13 【问题描述】:

我定义了以下内容:

    (struct type (parent dirty) #:mutable #:transparent)
    (define types (make-hash))

    (define (add-key predicate parent)
      (begin
        (hash-ref! types parent (type empty #t)) ;;if the parent doesn't exist, is created with no parent.
        (let([node (hash-ref types predicate #f)])
          (if(or (boolean? node)   ;;the node is not on the list
                 (not(equal? (type-parent node) parent))) ;;the node has a different parent
             (hash-set! types predicate (type parent #t))
             (printf "nothing to do\n")
             ))))

    (define (ancestor? predicate1 predicate2)
      (let ([node (hash-ref types predicate2 #f)])
        (cond [(false? node)(error "following predicate is not in types: " predicate2)]
              [(empty? (type-parent node)) #f]
              [(equal? (type-parent node) predicate1) #t]
              [else (ancestor? predicate1 (type-parent node))])))

它似乎工作得很好,我可以做这样的事情:

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

我似乎只对sort(sort '(integer? odd? number? list? even?) ancestor?) 有问题 抛出以下错误:following predicate is not in types: integer? 当然,这是在我的实现中定义的。问题是我确信键值对存在,我可以操纵它,我可以手动运行ancestor 的每一行代码......我真的很困惑可能导致这个......任何想法?

【问题讨论】:

注意:如果您在查询之前对树进行线性预处理,那么有一个非常可爱的算法可以让您在恒定时间内进行查询。见:***.com/questions/10310809/… 仔细阅读你的问题:当你说(sort '(integer? odd? number? list? even?))时,你真的是指(sort (list integer? odd? number? list? even?))吗? 【参考方案1】:

    我按原样提取了您的代码并将其放入文件中。

    添加了ancestor? 的跟踪行:在第一行添加(displayln `(ancestor? ,predicate1 ,predicate2)) 或添加(trace ancestor?)(在(require racket/trace) 之后)。

    这显示了代码中被破坏的违规调用:(ancestor? 'odd? 'integer?) 导致了该确切错误。

(我不知道你的代码在做什么:这个想法是很容易机械地推导出问题。)

【讨论】:

以上是关于球拍中的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

let 中的球拍创建函数/lambda

如何将列表作为球拍中的参数列表传递?

球拍中的make-hash make-weak-hash有啥区别?

球拍中的“匹配”可以有来自外部范围的变量模式吗?

node.js 中的奇怪行为

异常处理中的这种奇怪行为是啥?