在编程语言中使用atom数据类型的功能有多有用?

一些编程语言使用原子或符号的概念来表示某种常量.我遇到的语言(Lisp、Ruby和Erlang)之间有一些差异,但在我看来,一般的概念是相同的.我对编程语言设计感兴趣,我想知道atom类型在现实生活中有什么价值.其他语言,如Python、Java、C#似乎在没有它的情况下表现得相当不错.

我没有Lisp或Ruby的实际经验(我知道语法,但在实际项目中都没有使用过).我已经用了足够多的Erlang来适应那里的概念.

推荐答案

下面是一个简短的例子,展示了操纵符号的能力如何让代码更干净:(代码在Scheme中,是Lisp的一种方言).

(define men '(socrates plato aristotle))

(define (man? x) 
    (contains? men x))

(define (mortal? x) 
    (man? x))

;; test

> (mortal? 'socrates)
=> #t

可以使用字符串或整数常量编写此程序.但象征性的版本有一定的优势.符号在系统中保证是唯一的.这使得比较两个符号的速度与比较两个指针的速度一样快.这显然比比较两个字符串要快.使用整数常量可以让人们编写无意义的代码,比如:

(define SOCRATES 1)
;; ...

(mortal? SOCRATES)
(mortal? -1) ;; ??

也许这个问题的详细答案可以在Common Lisp: A Gentle Introduction to Symbolic Computation本书中找到.

Ruby相关问答推荐

如何查询哪些RuboCop规则适用于文件?

类 SpecificationPolicy 的超类不匹配

RSpec 是否有 python 类似功能来做 TDD?

配置 SubLime Linter 插件以使用 Ruby 1.9 语法

从 Time 对象获取下/上个月

Coffeescript 中等效的 Ruby .times

使用 bundler 安装较新版本的 bundler

Ruby 模块 - 包括 do 结束块

Ruby 2 中的命名参数

Ruby 中方法名称的限制是什么?

如何从 SystemStackError 中获取回溯:堆栈级别太深?

就地修改 ruby​​ 哈希(rails strong params)

如何在 Ruby 中创建私有类常量

不区分大小写的数组#include?

跳过 Enumerable#collect 中的迭代

if语句末尾带有then有什么区别?

不能在windows上安装thin

Ruby哈希中的条件键/值

=== 与 == 在 Ruby 中

Ruby Activerecord IN 子句