fun*_*ial 3 lisp scheme functional-programming data-structures chicken-scheme
我正在学习 Scheme,来自 Haskell 的背景,但我遇到了一个非常令人惊讶的问题——scheme 似乎没有自定义数据类型???(即对象、结构等)。我知道一些实现有自己的自定义宏来实现结构,但 R6RS 本身似乎没有提供任何这样的功能。
鉴于此,我有两个问题:
例如,任何试图返回多项数据的函数都需要某种封装数据的方式。是使用哈希映射的最佳实践吗?
(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)))))))
Run Code Online (Sandbox Code Playgroud)
为了回答你的问题,我认为给你一个稍微大一点的评论可能会有所帮助。
Scheme 经常被描述为与其说是一种语言,不如说是一个语言家族。R5RS 尤其如此,这仍然是许多人在说“方案”时的意思。
Scheme 家族中的几乎每一种语言都有结构。我个人最熟悉 Racket,您可以在其中使用struct或定义结构
define-struct。
“但是”,您可能会说,“我想编写我的程序,以便它可以在所有版本的 Scheme 中运行。” 几个非常聪明的人已经成功地做到了这一点:Dorai Sitaram 和 Oleg Kiselyov 都浮现在脑海中。然而,我对他们工作的观察是,通常,在不牺牲性能的情况下保持与许多方案版本的兼容性通常需要高水平的宏观专业知识和大量的认真思考。
确实有几个 SRFI 描述了结构设施。我个人给你的建议是选择一个 Scheme 实现,并让你自己对使用它提供的任何结构设施感觉良好。在某些方面,这与 Haskell 没有什么不同。有一些特定于 ghc 的功能,并且一般来说,我声称大多数 Haskell 程序员都乐于使用这些功能,而不必担心它们不适用于所有版本的 Haskell。
| 归档时间: |
|
| 查看次数: |
2523 次 |
| 最近记录: |