6

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

  1. 为什么没有“真正的”变量?为什么 Racket/Scheme 中的一切都是函数?为什么语言设计者不包括他们?

  2. 是什么define-struct?它是一个函数吗?是一堂课吗?我不知何故,由于我的 PHP 背景,总是认为它是一个类,但这并不完全正确。

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

4

4 回答 4

23
  1. Racket 中有“真实的”变量。例如,如果您编写此代码

    (define x 3)
    

    'global' 变量x将被设置为值 3。如果你现在写

    (set! x 4)
    

    该变量x会将其值更改为 4。因此,在 Racket 中,您可以根据需要使用任何“正常”语言中的“正常”变量。事实上,在 Racket 中,首选的编程风格是功能性的,而不是过程性的。在函数式编程风格中,不鼓励变量突变。

  2. define-struct是一个球拍宏,用于定义“结构模板”以及其他一些东西。例如,如果你写:

    (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
      
于 2012-04-10T12:05:20.590 回答
8

也许最流行或最时尚的编程方式(使用 C++、Javascript 和 Java 等语言)具有一些特点。你可能认为它们是理所当然的,是不言而喻的,唯一可能的方式。它们包括:

  • 至关重要的

你专注于说“做这一步,然后是下一步”等等。

  • 使用突变。

您声明一个变量,并不断为其分配不同的值(“改变它”)。

  • 面向对象。

您将代码和数据捆绑到类中,并将它们的实例声明为对象。然后你改变对象。

学习计划或球拍将帮助您了解这些并不是唯一的方法。

一开始它可能会让你的大脑受伤,就像哲学课可能会让你质疑你认为理所当然的事情一样。然而,与哲学课不同的是,让大脑受伤会有一些实际的回报。:)

替代:

  • 函数式(而不是命令式)。专注于返回值的表达式,而不是制作步骤的待办事项列表。
  • 不可变。同上。
  • 不是面向对象的。使用类的对象可能是解决某些问题的好方法,但不是全部。如果您想将代码与数据捆绑在一起,还有一些更通用的方法可以实现,例如带有“let over lambda”的闭包等等。有时您不需要类的所有“包袱”,尤其是继承。

Scheme 和 Racket 使探索这些想法变得容易。但它们不像 Haskell 那样“纯函数式”,所以如果你真的想做命令式、可变、面向对象的事情,你也可以这样做。然而,学习 Racket 以与 Javascript 相同的方式做事并没有多大意义。

于 2012-04-10T17:58:35.910 回答
5

计划非常有“真实”的变量。

函数式语言(如 Racket)和命令式语言(如 JavaScript 或 PHP)之间的区别在于,在函数式语言中,您通常不使用可变状态。变量最好被认为是值的名称,而不是可以保存值的容器。您无需使用循环构造来更改变量中的值,而是使用递归进行流控制。

define-struct是一种特殊的句法形式,有点像其他语言中的关键字。(与其他语言不同,在Scheme 中您可以创建自己的句法形式。)它定义了一个结构类型,它类似于一个类,但没有方法。它还定义了许多帮助您利用新结构类型的函数。

于 2012-04-10T11:55:26.667 回答
2
  1. Scheme中有变量。

    > (define a 1)
    #<unspecified>
    > a
    1
    > (set! a 2)
    #<unspecified>
    > a
    2
    

    这种语言中甚至还有可变数据结构。

    > (begin
    >   (define v (make-vector 4))
    >   (vector-set! v 0 'foo)
    >   (vector-set! v 1 'bar)
    >   (vector-set! v 2 'baz)
    >   (vector-set! v 3 'quux))
    #<unspecified>
    > v
    #(foo bar baz quux)
    

    Scheme 不是纯 FP 语言;它确实允许命令式编程,尽管它主要面向函数式编程。这是 Scheme 的发明者做出的设计选择。

  2. define-struct是一种特殊形式;它的语法,就像 JavaScript 中的functionorreturn关键字。

于 2012-04-10T11:52:23.790 回答