data-structures - Scheme 中的数据结构

标签 data-structures functional-programming scheme lisp chicken-scheme

我正在学习 Scheme,有 Haskell 背景,我遇到了一个非常令人惊讶的问题 - Scheme 似乎没有自定义数据类型??? (即对象、结构等)。我知道一些实现有自己的自定义宏来实现结构,但 R6RS 本身似乎没有提供任何此类功能。

鉴于此,我有两个问题:

  1. 这是正确的吗?我是否缺少允许创建自定义数据类型的功能?
  2. 如果不是,方案程序员如何构建程序?

例如,任何试图返回多项数据的函数都需要某种方式来封装数据。使用 HashMap 是最佳做法吗?

(define (read-user-input)
    (display "1. Add todo\n2. Delete todo\n3. Modify todo\n")
    (let ((cmd-num (read)))
    (if (equal? cmd-num "1") '(("command-number" . cmd-num) ("todo-text" . (read-todo)))
    (if (equal? cmd-num "2") '(("command-number" . cmd-num) ("todo-id"   . (read-todo-id)))
                             '(("command-number" . cmd-num) ("todo-id"   . (read-todo-id)))))))

最佳答案

为了回答你的问题,我想给你一个稍微大一点的评论可能会有所帮助。

Scheme 通常被描述为与其说是一种语言,不如说是一种语言家族。 R5RS 尤其如此,这仍然是许多人说“方案”时的意思。

几乎 Scheme 家族中的每一种语言都有结构。我个人最熟悉 Racket,您可以在其中定义结构 structdefine-struct

“但是”,您可能会说,“我想编写我的程序,以便它可以在 所有 版本的 Scheme 中运行。”几个非常聪明的人已经成功地做到了这一点:我想到了 Dorai Sitaram 和 Oleg Kiselyov。然而,我对他们工作的观察是,一般来说,在不牺牲性能的情况下保持与多个版本方案的兼容性通常需要高水平的宏观专业知识和大量认真思考。

确实有几个 SRFI 描述了结构设施。我个人对您的建议是选择一个 Scheme 实现,并让自己对使用它提供的任何结构设施感到满意。在某些方面,这与 Haskell 没有什么不同;有特定于 ghc 的功能,一般来说,我声称大多数 Haskell 程序员都乐于使用这些功能,而不必担心它们无法在所有版本的 Haskell 中工作。

关于data-structures - Scheme 中的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49908937/

相关文章:

java - 当添加一些随机元素时,PriorityQueue中的优先级如何确定?

C - 从数组(结构数组)中删除除平均成绩最高的 10 名学生之外的学生

functional-programming - 您将如何在 Clojure 或一般的函数式语言中实现按契约(Contract)设计?

java - 查询 Java 数据结构

python生成器时间复杂度混淆

r data.table 函数式编程/元编程/语言计算

Haskell 无法将预期类型 [char] 与实际类型 IO 匹配

c - 是否可以在 C 语言的函数中构建函数?

list - 方案:找出 "complex"元素是否在 "complex"列表中

compiler-construction - 是否有针对不同 "RnRS"方案标准的摘要?