【问题标题】:convert strings in list to numbers in racket?将列表中的字符串转换为球拍中的数字?
【发布时间】:2017-04-13 02:19:47
【问题描述】:

呼吁所有球拍开发人员,我是球拍语言和一般功能语言的新手。长话短说,我有一个包含数字和字符串的嵌套列表,我想将字符串元素转换为数字。

示例:如果我有这样的列表 '( 3 "3"( 1 "1"()( 2 "2" () ()))( 5 "5" () () ))


我想转换成'( 3 3( 1 1()( 2 2 () ()))( 5 5 () () ))
在保持相同形状的同时,我写了这个函数
(define (mapBst BST someFunct )
 (if (null? BST) '()
      (someFunct (car(cdr BST)) (mapBST someFunct (cdr (car BST))))
      )
  )
(mapBst  '( 3 "3"( 1 "1"()( 2 "2" () ()))( 5 "5" () () )) string->number)

但是我收到了这个错误:cdr:合同违规 预期:对? 给定:3

任何线索我为什么会收到此错误或我做错了什么,任何建议都会有所帮助。提前谢谢你

【问题讨论】:

  • 你定义了函数mapBST并用mapBst调用。
  • @ymonad 感谢提醒我修正了错字但仍然无法正常工作检查我更新了上面的问题
  • 该错误源自(cdr (car BST))),其中(car BST)3,调用(cdr 3) 无效。

标签: lisp racket


【解决方案1】:

我建议这样做:

(define (mapBST BST someFunct)
  (cond [(null? BST)
         '()]
        [(list? (car BST))
         (cons (mapBST (car BST) someFunct)
               (mapBST (cdr BST) someFunct))]
        [else
         (cons (someFunct (car BST))
               (mapBST (cdr BST) someFunct))]))

例子:

> (mapBST '( 3 "3"( 1 "1"()( 2 "2" () ()))( 5 "5" () () ))
          (λ (x) (if (string? x) (string->number x) x)))
'(3 3 (1 1 () (2 2 () ())) (5 5 () ()))

【讨论】:

  • 我想知道 (λ (x) (if (string? x) (string->number x) x))) 逻辑是否可以进入 mapBST 内部的某个地方,所以方法调用看起来很干净 (mapBst '( 3 "3"( 1 "1"()( 2 "2" () ()))( 5 "5" () () )) string->number)
  • @kero 当然。将else 更改为(string? (car BST)),然后添加一个新的else case,其结果为(cons (car BST) (mapBST (cdr BST) someFunct))
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 2019-05-02
  • 2018-03-23
  • 1970-01-01
  • 2021-09-22
  • 2021-12-04
  • 2016-12-24
相关资源
最近更新 更多