【问题标题】:Using string->number on a list containing strings and numbers在包含字符串和数字的列表上使用 string->number
【发布时间】:2017-04-17 18:04:15
【问题描述】:

我正在尝试递归解析包含数字、字符串和空列表的列表,并使用 string->number 将任何字符串转换为数字

(define tnode '(5 "5" () ()))

使用函数

(define (test funct inlist)
    (cond((null? inlist) '())
         ((number? inlist) ((cons (car inlist) (test funct (cdr inlist)))))
         (else (cons (funct (car inlist)) (test funct (cdr inlist))))
         )
    )

作为

(test string->number tnode)

但是,我在第一个数字 5 上收到了合同违规错误(如果我使用仅包含字符串和空列表的 tnode,则在后面的空列表上)。似乎该函数忽略了前两个条件并直接进入 else 语句。为什么是这样?我不相信有任何语法错误,因为我测试过的其他 cond 函数运行良好。我不太确定是什么问题。

【问题讨论】:

    标签: scheme type-conversion racket


    【解决方案1】:

    inlist 是整个列表;你想检查它的第一个元素,就像你处理结果中的第一个元素一样。

    【讨论】:

    • 谢谢您,这有助于解决数字问题,但未显示空列表。我得到了 '(5 5) 而不是 '(5 5 () ()) 的输出。
    • 我发现问题是,我需要 (null? inlist) 的条件和 (null? (car inlist)) 的条件,因为需要一个最终的空值由于递归最终代码将在另一个答案中工作
    【解决方案2】:

    给我所需输出的功能代码如下

    (define (test funct inlist)
        (cond((null? inlist) '())
             ((null? (car inlist)) (cons '() (test funct (cdr inlist))))
             ((number? (car inlist)) (cons (car inlist) (test funct (cdr inlist))))
             (else (cons (funct (car inlist)) (test funct (cdr inlist))))
             )
        )
    

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 2015-02-02
      • 2017-07-04
      • 2018-12-18
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      相关资源
      最近更新 更多