【问题标题】:Using car and cdr使用汽车和 cdr
【发布时间】:2018-01-12 15:38:02
【问题描述】:

我是计划新手,很难使用 car 和 cdr。我在 ast 中有一个 AST 字符串文字。

(define ast '(program
  ((assign (var i int) (call (func getint void int) ()))
   (assign (var j int) (call (func getint void int) ()))
   (while (neq (var i int) (var j int))
    ((if (gt (var i int) (var j int))
         ((assign (var i int) (minus (var i int) (var j int))))
         ((assign (var j int) (minus (var j int) (var i int)))))))
   (call (func putint int void) ((var i int)))))
)

我知道 car 返回了 ast 的负责人。所以

(car ast)

返回'程序。

我很困惑如何使用 car 和 cdr 从 ast 中获取字符串,例如 'assign、'while、'if 和 'call。

【问题讨论】:

  • 你想用'assign等做什么?只需获取所有列表,或者您是否尝试解释 AST?
  • 我正在尝试遍历 AST 并对其进行解释。
  • 你熟悉递归吗?您可以尝试编写一个递归函数来执行此操作吗?
  • 使用 match 参见文档(指南)。
  • 这不是字符串文字,而是符号列表。

标签: functional-programming scheme racket


【解决方案1】:

您需要了解如何构建对和列表,来自The Racket Reference

一对恰好结合了两个值。第一个值通过 car 过程访问,第二个值通过 cdr 过程访问。对是不可变的(但请参阅可变对和列表)。

一个列表是递归定义的:它要么是常量 null,要么是第二个值为列表的对。

基本上每个 Pair (x . y) 由两个元素组成 - car 得到我们 x cdr 得到我们 y。

请注意,x y 本身都可以是对或列表,就像您的 AST 一样,即(来自同一引用):

> (define lst1 (list 1 2 3 4))

>lst1 

'(1 2 3 4)

注意'(1 2 3 4) 实际上是:(1 . ( 2 . ( 3 . ( 4 . ())))

> (car lst1)

1

> (cdr lst1)

'(2 3 4)

> (car (cdr lst1))

2

链接 car 和 cdr 调用的另一种方法(从右侧阅读): cadr 表示(cdr lst),然后在答案上应用car => (car (cdr lst)) == (cadr lst)

> (cdddr lst1)

'(4)

> (cadddr lst1)

4

> (define lst2 (list (list 1 2) (list 3 4)))

>lst2 

'((1 2) (3 4)) 

== ( ( 1 . ( 2 . ()) ) . ( 3 . ( 4 . () )))

> (car lst2) 

'(1 2)

>(cdr lst2)

'((3 4))

实际上是((3 . (4 . () ) ) . () ) == ((3 4) . ()) == ((3 4))

您没有问,但我假设您将遍历树/列表。 最终,您将不得不使用递归遍历(除非使用现阶段不适合的高级方法,即在准备好时检查 CPS),如下所示:

(define runner 
  (lambda (tree)
    (if (null? tree)
        null
        (let ((first_element (car tree))
              (rest_of_tree  (cdr tree)))
          ;body:
          ;do some logic like:
              ;if first is list call runner on it:
              ;(runner rest_of_tree)
              ;possibly chain answer of logic and call together
              ;else check/return string is there (recognize tree root)
          ))))

希望这有助于欢迎提问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2012-01-10
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2018-10-13
    相关资源
    最近更新 更多