【问题标题】:scheme define cdr contract violation expected pair given '()方案定义 cdr 合同违反预期对给定 '()
【发布时间】:2017-04-22 18:24:54
【问题描述】:

给定定义树:

(define tree
  '("S" (("-" ("A" 3333) ("A" 4444))
         ("W" (("+" ("R" 0) ("R" 1))
               ("+" ("R" 1) ("R" 2))
               ("+" ("R" 2) ("R" 3))
               ("+" ("R" 3) ("R" 4))
               ("+" ("R" 4) ("R" 5)))
              (("-" ("R" 0) ("R" 1))
               ("-" ("R" 1) ("R" 2))
               ("-" ("R" 2) ("R" 3))   
               ("-" ("R" 3) ("R" 4))
               ("-" ("A" 1000) ("A" 2000)))))))

我正在尝试访问这些值。执行carcdr 对第一个起作用,然后得到其余的,但是当我尝试获得像("A" 1000) 这样的特定值时,我得到了错误:

cdr:违反合同
预期:一对?
给定:'()。

我已经尝试过(car (cdr (cdr (cdr '(tree)))))(cdddr tree),但我总是遇到这个错误。任何有用的提示将不胜感激。

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    你不能把tree放在一个列表中:'(tree),那只是一个带有'tree符号的列表,与你之前定义的实际变量的值没有关系。要访问所需的元素,请执行以下操作:

    (car (cdr (car (car (cdr tree)))))
    => '("A" 3333)
    

    另外,我想建议您重新考虑您表示和/或遍历信息的方式,正如您所见,从如此复杂的树中提取数据非常困难......

    【讨论】:

    • 好的,我找到了一种通过 caadr 更好地访问信息的方法,但是穿过树时我遇到了墙。如果不等于最后一个节点,我试图使用递归,那么它将调用它自己。但是我无法找到一种方法来实际移动我的位置而不用硬编码
    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 2018-02-04
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多