Lisp 将列表中的字符串转换为球拍中的数字?

Lisp 将列表中的字符串转换为球拍中的数字?,lisp,racket,Lisp,Racket,打电话给所有的racket开发者,我是racket语言和函数语言的新手。长话短说,我有一个包含数字和字符串的嵌套列表,我想将字符串元素转换为数字 示例:如果我有这样的列表 '(3“3”(1“1”(2“2)())(5“5”()) 我想转换成”(33(11()(22())(55()) 在保持相同形状的同时,我编写了这个函数 (define (mapBst BST someFunct ) (if (null? BST) '() (someFunct (car(cdr BST)) (map

打电话给所有的racket开发者,我是racket语言和函数语言的新手。长话短说,我有一个包含数字和字符串的嵌套列表,我想将字符串元素转换为数字

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

我想转换成
”(33(11()(22())(55())

在保持相同形状的同时,我编写了这个函数

(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

任何关于我为什么会犯这个错误或我做错了什么的线索,任何建议都会有所帮助。提前谢谢

我建议:

(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 () ()))

您定义了函数
mapBST
,并调用了
mapBST
@ymonad,感谢您的提示我修复了输入错误但仍不工作检查我更新了上面的问题该错误源于
(cdr(car BST))
其中
(car BST)
3
,调用
(cdr 3)
无效。我想知道
(λ(x)(如果(string?x)(string->number x)x))
逻辑可以进入mapBST内部的某个地方,因此方法调用看起来很干净
(mapBST'(3“3”(1“1”()(2“2”())(5“5”())string->number)
@kero-Sure。将
else
更改为
(string?(car BST))
,然后添加一个新的
else
案例,其结果为
(cons(car BST)(mapBST(cdr BST)someFunct))