Scheme 如何将方框表示转换为括号表示

Scheme 如何将方框表示转换为括号表示,scheme,lisp,common-lisp,Scheme,Lisp,Common Lisp,有一段时间我一直在做一些清晰的事情,但在某个时候,我无法理解 所以我知道这幅图代表的是(a b c x d): 但是,我不知道这一次会发生什么: 因为有一个上面没有任何东西,它指向两件事,如何用括号写下bx和da有两种方式 我会写它(c((b(x))(d(a))),但我不是很确定 谢谢你的回答,我很感激 我认为思考这些问题的有效方法是认识到两件事: 所有的盒子都是cons单元,也就是成对的 有一种略显无用的速记被使用,如果你在没有速记的情况下重新绘制图表,它更容易翻译 没有帮助的速记是这

有一段时间我一直在做一些清晰的事情,但在某个时候,我无法理解

所以我知道这幅图代表的是
(a b c x d)

但是,我不知道这一次会发生什么:

因为有一个上面没有任何东西,它指向两件事,如何用括号写下bx和da有两种方式

我会写它(c((b(x))(d(a))),但我不是很确定


谢谢你的回答,我很感激

我认为思考这些问题的有效方法是认识到两件事:

  • 所有的盒子都是cons单元,也就是成对的
  • 有一种略显无用的速记被使用,如果你在没有速记的情况下重新绘制图表,它更容易翻译
没有帮助的速记是这样画的一个方框:

事实上,这很简单:

其中,
()
是唯一的“空框”对象,在Lisp中传统上称为
nil
,但在Scheme中没有名称(我认为)作为标准

所以知道了这个速记,你就可以拍下你的照片,这张照片和这张一样

然后把它展开到这个

好了,现在你有了这张展开的图片,你可以简单地写下这张图片的文本表示形式,记住cons单元格的表示形式是
(l.r)
,比如说,
l
r
是左右元素,空框对象的表示形式是
()

我不打算写下你问题的文本表述,因为我不想做你的家庭作业——我想解释如何做你的家庭作业但我会写下这方面的表述,比如:

好的,按照方框我们得到一个表示,它是

((x . ()) . (y . ())
哎呀,这可不是你需要得到的答案

但这一切并没有失去。现在您需要知道最后一件事:有三条特殊规则适用于打印(或读取)这样的conse树(图)

  • 规则1.格式为
    (.())
    的cons可以写成
    ()
  • 规则2。右手输入(cdr)本身就是cons的cons可以省略圆点,并将右手cons拼接在一起。例如,
    (x.(y…)
    可以写成
    (xy…)
  • 规则3。在编写cons树时,通常尝试应用规则1和规则2,以尽量减少打印表示中的点数
让我们将这些规则应用于上述结构

  • 我们从
    ((x)()(y)()
    开始
  • 我们可以对每一半应用规则1两次,得到
    ((x)。(y))
  • 我们现在可以应用规则2一次,因为顶部对象的右侧是cons,以获得
    ((x)y)
    。这与您希望提供的表示类似
作为应用这些规则的指南,最好从内到外应用它们,并应用所有规则1和规则2

总之,我建议的方法是:

  • ()
    删除的缩写重新绘制图表
  • 从中读出cons树结构作为
    (……)
  • 使用上面的规则来最小化你写下的cons树中的点数
  • 利润

  • 我认为思考这些问题的有效方法是认识到两件事:

    • 所有的盒子都是cons单元,也就是成对的
    • 有一种略显无用的速记被使用,如果你在没有速记的情况下重新绘制图表,它更容易翻译
    没有帮助的速记是这样画的一个方框:

    事实上,这很简单:

    其中,
    ()
    是唯一的“空框”对象,在Lisp中传统上称为
    nil
    ,但在Scheme中没有名称(我认为)作为标准

    所以知道了这个速记,你就可以拍下你的照片,这张照片和这张一样

    然后把它展开到这个

    好了,现在你有了这张展开的图片,你可以简单地写下这张图片的文本表示形式,记住cons单元格的表示形式是
    (l.r)
    ,比如说,
    l
    r
    是左右元素,空框对象的表示形式是
    ()

    我不打算写下你问题的文本表述,因为我不想做你的家庭作业——我想解释如何做你的家庭作业!——但我会写下这个表述,比如:

    好的,按照方框我们得到一个表示,它是

    ((x . ()) . (y . ())
    
    哎呀,这可不是你需要得到的答案

    但一切都没有失去。现在你需要知道最后一件事:有三个特殊的规则适用于打印(或读取)像这样的conses的树(图)

    • 规则1.格式为
      (.())
      的cons可以写成
      ()
    • 规则2。右手输入(cdr)本身是cons的cons可以省略点,并将右手cons拼接。因此
      (x.(y…)
      可以写成
      (x.(y…)
    • 规则3。在编写cons树时,通常尝试应用规则1和规则2,以尽量减少打印表示中的点数
    让我们将这些规则应用于上述结构

    • 我们从
      ((x)()(y)()
      开始
    • 我们可以对每一半应用规则1两次,得到
      ((x)。(y))
    • 我们现在可以应用规则2一次,
      (a b c x d)
      
      (c . ((b . (x . ())) . (d . (a . ()))))
      
      [ * | * ] --->  B
        |
        |
        v
        A
      
      ( {A} . {B} )
      
      [ * | / ]
        |
        |
        v
        A
      
      [ A | * ] ---> NIL
      
      (c . { ...                                  })
      (c . ( {...}             . { ...           }))
      (c . ( {...}             . (d . { ...     })))
      (c . ( {...}             . (d . (a . {NIL}))))
      (c . ( (b . {...})       . (d . (a . {NIL}))))
      (c . ( (b . (x . {NIL})) . (d . (a . {NIL}))))
      (c . ( (b . (x . (   ))) . (d . (a . (   )))))
      
      (A B ... . (C ...))  ===  (A B ... C ...)  ;; NB nothing after (C ...)!
      
      (c . ( (b . (x . (   ))) . (d . (a . (   )))))
      (c . ( (b . (x        )) . (d . (a . (   )))))
      (c . ( (b . (x        )) . (d . (a        ))))
      (c . ( (b . (x        )) . (d    a         )))
      (c . ( (b    x         ) . (d    a         )))
      (c . ( (b    x         )    d    a          ))
      
      (c . ( (b . (x . (   ))) . (d . (a . (   )))))
      (c     (b . (x . (   ))) . (d . (a . (   ))) )
      (c     (b . (x . (   )))    d . (a . (   ))  )
      (c     (b . (x . (   )))    d    a . (   )   )
      (c     (b . (x        ))    d    a           )