【问题标题】:Why does the list result returned by my function look funny?为什么我的函数返回的列表结果看起来很有趣?
【发布时间】:2020-12-21 21:47:49
【问题描述】:
(define (evenList xs)
    (cond
        ((null? xs) '())   
        ((eq? (cdr xs) '()) '()) 
        (else (cons (cadr xs) (evenList (cddr xs))))))

我正在使用此代码,但它并没有按照我想要的方式创建列表。 (evenList (list 1 2 3 4)) 在 REPL 中计算为 (cons 2 (cons 4 '())),但我希望它类似于 (list 2 4)

【问题讨论】:

  • '但它没有按照我想要的方式创建列表'不是很有帮助。目前的结果是什么?预期/要求的结果是什么?
  • (evenList (list 1 2 3 4)) 上面代码中这个函数的答案(cons 2 (cons 4 '()))但我希望它是这样的(list 2 4 )
  • 谢谢你,它解决了我的问题
  • @DarKing -- 我编辑了您的问题以澄清问题并让未来的访问者更容易找到;我希望这没问题。我还将我之前的评论移到了答案中。

标签: racket interpreter read-eval-print-loop racket-student-languages repl-printed-representation


【解决方案1】:

据我所知,您的代码可以正常工作并给出正确的输出。我猜你正在使用初级学生语言。使用初级学生语言时,列表(2 4) 在 REPL 中表示为(cons 2 (cons 4 '()));当使用中级学生语言时,这个相同的列表在 REPL 中表示为(list 2 4)。在#lang racket 中,您会在 REPL 中看到这表示为 '(2 4)。在所有情况下,底层列表数据结构都是相同的;这只是列表的打印表示的问题。

【讨论】:

  • 我们真的应该在 Racket 中为这个“打印格式”的东西制作一些特定的标签。这些问题不断出现,拥有标签将有助于找到类似的问题。
  • @WillNess -- 这是个好主意。我在回答之前寻找了一个骗子,但找不到任何东西;标签会很有帮助。由于印刷表示在一般的 lisps 中非常重要,我可能会提名 printed-representation。乍一看,我现在没有看到类似的东西。
  • 好主意,我认为。当然也会被其他语言采用,具有丰富的数据表面语法,例如(我听到了;)) Clojure。你应该继续在这个 Q 上添加这个标签。如果由于某种原因你不被允许,ping 我,我会这样做,我以前也这样做过(例如map-function)。但既然你已经想出了它,你应该有幸自己做。 :)
  • 我们如何将其重命名为“repl-printed-representation”,更具体地说?到目前为止,我只发现并标记了几个问题,不必费心去重新标记它们。另一种选择是始终将它们标记为“repl”,但 5 个标签的限制有时不允许这样做。你怎么看? “印刷表示”似乎过于宽泛,也可能包括序列化问题,或者被误认为并被删除。 (!)
  • @WillNess -- 我不一定反对这一点,但我不认为印刷表示仅适用于 REPL。 Lisp 阅读器读取打印的表示,并且可以从例如文件中读取它们。我不确定通过更具体是否会有所收获,但 REPL 也可能是大多数问题出现的地方。无论哪种方式我都感觉不太强烈......
猜你喜欢
  • 2012-12-27
  • 2013-06-24
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多