functional-programming - Racket 中的定义结构是什么,为什么没有变量?

标签 functional-programming scheme racket

在我在大学的一门 CS 类(class)中,我们必须与 Racket 合作。我在大学之前的大部分编程时间都花在了 PHP 和 Java 以及 JavaScript 上。我知道 Racket 是一种函数式编程语言,就像 JavaScript 一样(编辑:当然不是。但我觉得我正在用它进行“函数式”编程,在看到答案后,这是一种错误的看法。)但我仍然不了解Racket(Scheme)的一些基本特性。

  • 为什么没有“真实”变量?为什么在 Racket/Scheme 中一切都是函数?为什么语言设计者不包括他们?
  • 什么是define-struct ?是函数吗?是一个类吗?我不知何故,因为我的 PHP 背景,一直认为它是一个类,但这不可能真的正确。

  • 我的问题是我想了解语言的概念。我个人仍然认为它真的很奇怪,不像我以前使用过的任何东西,所以我的大脑试图将它与 JavaScript 进行比较,但它对我来说似乎如此不同。与 JavaScript 的平行/差异会大有帮助!

    最佳答案

  • Racket 中有“真实”变量。例如,如果你写这个
    代码
    (define x 3)
    

    “全局”变量 x将被设置为值 3。如果你现在写
    (set! x 4)
    

    变量 x将其值更改为 4。因此,在 Racket 中,您可以
    有一个“普通”变量,就像任何“普通”语言一样,如果你
    想。事实是,在 Racket 中首选的编程风格是
    功能性的,而不是程序性的。函数式编程风格
    不鼓励变量突变。
  • define-struct是一个 Racket 宏,用于定义“结构”
    模板”以及其他一些东西。例如,如果你
    写:
    (define-struct coord (x y))
    

    您刚刚定义了一个“结构模板”(即名为 coord 的用户类型)
    有两个“插槽”:xy) .之后,您现在可以:
  • 创建结构的新“实例”coord ,例如像这样:(make-coord 2 3)
  • 从结构对象中提取槽值:
    (coord-x (make-coord 2 3)) ;will return 2
    

    或者
    (coord-y (make-coord 2 3)) ;will return 3
    
  • 你可以问某个给定的对象是否就是那个结构。为了
    例如,(coord? 3)将返回 #f ,因为 3 不是 coord 类型
    结构,但
    (coord? (make-coord 2 3)) ;will return #t
    
  • 关于functional-programming - Racket 中的定义结构是什么,为什么没有变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10088098/

    相关文章:

    scheme - 在 Chez Scheme 中查找操作系统和机器类型

    lisp - 为什么 Clojure 除了 "keywords"之外还有 "symbols"?

    functional-programming - Racket 中的条件模式匹配

    racket - 如何向 Racket 中的词法分析器添加状态?

    javascript - 为什么 Promise 是 Monad?

    c 将外部函数函数分配给变量

    scheme - 有人使用Scheme 编程语言吗?

    racket - 如何在Typed Racket中定义Union多态数据结构的实例?

    Java 8 服务调用和功能构造

    haskell - 将函数列表应用于输入