首页
学习
活动
专区
圈层
工具
发布

car和cdr
EN

Stack Overflow用户
提问于 2017-08-04 16:03:23
回答 1查看 3.2K关注 0票数 1

我是新计划和有一个困难的时间使用汽车和cdr。我最近有一个ast字符串。

代码语言:javascript
复制
(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)))))
)

我知道车还在前面。所以

代码语言:javascript
复制
(car ast)

返回程序。

我搞不懂如何使用car和cdr从ast获取字符串,例如“assign”、while、if和“call”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-05 12:23:17

您需要了解如何从球拍参考构建成对和列表

一对组合恰好是两个值。使用car过程访问第一值,用cdr过程访问第二值。对不是可变的(但请参阅可变对和列表)。 列表是递归定义的:它要么是常量null,要么是第二个值为list的一对。

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

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

代码语言:javascript
复制
> (define lst1 (list 1 2 3 4))

>lst1 

'(1 2 3 4)

请注意,'(1 2 3 4)实际上是:(1 . ( 2 . ( 3 . ( 4 . ()))) <--对于了解方案中的实现非常重要。

代码语言:javascript
复制
> (car lst1)

1

> (cdr lst1)

'(2 3 4)

> (car (cdr lst1))

2

另一种连接car和cdr调用的方法(从右读取):cdr的意思是(cdr lst),然后在应答=> (car (cdr lst)) == (cadr lst)上应用car

代码语言:javascript
复制
> (cdddr lst1)

'(4)

> (cadddr lst1)

4

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

>lst2 

'((1 2) (3 4)) 

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

代码语言:javascript
复制
> (car lst2) 

'(1 2)

>(cdr lst2)

'((3 4))

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

你没有问,但我假设你要遍历这棵树/列表。最终,您必须使用递归遍历(除非在此阶段使用不适合的高级方法,即准备就绪时检查CPS )如下:

代码语言:javascript
复制
(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)
          ))))

希望这有助于问题的欢迎。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45511191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档