LISP 中的变量和符号有什么区别?

2024-04-08

从范围上来说?内存中的实际实现?语法?例如, if (let a 1) 'a' 是变量还是符号?


约尔格的回答指出了正确的方向。让我补充一点。

我将讨论与 Common Lisp 类似的 Lisp。

作为数据结构的符号

符号是 Lisp 中真实的数据结构。您可以创建符号,可以使用符号,可以存储符号,可以传递符号,并且符号可以是更大数据结构的一部分,例如符号列表。符号有名称,可以有值,也可以有函数值。

所以你可以获取一个符号并设置它的值。

(setf (symbol-value 'foo) 42)

通常有人会写(setq foo 42), or (set 'foo 42) or (setf foo 42).

代码中表示变量的符号

But!

(defun foo (a)
  (setq a 42))

or

(let ((a 10))
   (setq a 42))

在上述两种形式的源代码中都有符号和a像符号一样写并使用函数READ读取该源会返回一个符号a在一些列表中。但是setq操作不设置符号值a to 42。这里的LETDEFUN介绍一个VARIABLE a我们用符号书写。就这样SETQ然后操作将变量值设置为42.

词汇绑定

所以,如果我们看一下:

(defvar foo nil)

(defun bar (baz)
  (setq foo 3)
  (setq baz 3))

我们引入一个全局变量FOO.

在酒吧第一个SETQ设置全局变量的符号值FOO。第二SETQ设置局部变量BAZ to 3。在这两种情况下我们都使用相同的SETQ我们将变量写为符号,但在第一种情况下FOO捐赠一个全局变量,并将这些值存储在符号值中。在第二种情况下BAZ表示局部变量以及该值如何存储,我们不知道。我们所能做的就是访问变量来获取它的值。在 Common Lisp 中没有办法获取符号BAZ并获取局部变量值。我们无法使用符号访问局部变量绑定及其值。这是 Common Lisp 中局部变量的词法绑定工作方式的一部分。

例如,这导致观察到,在没有记录调试信息的编译代码中,符号BAZ离开了。它可以是处理器中的寄存器或以其他方式实现。符号FOO仍然存在,因为我们将它用作全局变量。

符号的各种用途

符号是 Lisp 中的一种数据类型、一种数据结构。

变量是一个概念性的东西。全局变量基于符号。局部词法变量不是。

在源代码中,我们使用符号编写函数、类和变量的各种名称。

有一些概念重叠:

(defun foo (bar) (setq bar 'baz))

在上面的源代码中,defun, foo, bar, setq and baz都是符号。

DEFUN是提供宏的符号。FOO是提供功能的符号。SETQ是提供特殊运算符的符号。BAZ是用作数据的符号。因此前面的引用BAZ. BAR是一个变量。在编译后的代码中不再需要其符号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LISP 中的变量和符号有什么区别? 的相关文章

  • 计算函数合理性的算法/蒙特卡罗方法

    我正在编写一个程序 尝试复制本文开头讨论的算法 http www stat stanford edu cgates PERSI papers MCMCRev pdf http www stat stanford edu cgates PER
  • Java Stream:通过布尔谓词分为两个列表

    我有一个清单employees 他们有isActive布尔字段 我想分employees分为两个列表 activeEmployees and formerEmployees 是否可以使用 Stream API 来实现 最尖端的方法是什么 C
  • 为什么类型系统拒绝我看似有效的程序?

    注意这个程序 class Convert a b where convert a gt b data A A deriving Show data B B deriving Show data C C deriving Show data
  • 如何在函数式编程中为AST节点生成稳定的id?

    我想将一个特定的 AST 节点替换为另一个节点 并且这个替换的节点是由交互式用户输入指定的 在非函数式编程中 可以使用可变数据结构 并且每个AST节点都有一个对象引用 因此当我需要引用特定节点时 我可以使用这个引用 但在函数式编程中 使用I
  • D 中的特征可以用于类型类吗?

    我是 D 新手 我正在寻找一种使用类似 Haskell 的类型类进行编程的好方法 例如D 中的函子 幺半群等 Tango 或 Phobos 中是否实现了类似的功能 我听说过可以对某些属性进行编译时类型检查的特征 它们可以用于类型类吗 我尝试
  • 阻塞事件循环

    我正在通过 Nodeschool 参加 函数式 Javascript 研讨会 其中一项练习的标题是 阻止事件循环 我很难理解它 通过过去的练习 我确保真正尝试理解解决方案 这样如果我必须重做问题 我就会理解如何解决它 而不是第一次就破解它
  • scalaz 中的 Store 是什么

    我试图理解Lenses in scalaz 令人惊讶的是没有找到类似的东西cats core 我遇到了所谓的Store这是一个类型别名 type StoreT F A B IndexedStoreT F A A B type Indexed
  • Scheme/Lisp 嵌套循环和递归

    我正在尝试解决方案中的一个问题 该问题要求我使用嵌套循环或嵌套递归 例如我有两个列表 我必须检查它们的笛卡尔积的条件 解决这些类型问题的最佳方法是什么 有关如何简化这些类型的函数的任何指示吗 I ll elaborate a bit sin
  • 为什么 x = x +1 在 Elixir 中有效?

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 返回元组的第一个元素

    假设我创建一个将两个整数相加的函数 def addInt a Int b Int Int Int val x a b x 2 我回来了 result 2 故意为了这个问题 现在我想创建一个仅返回 x 的变量 val result addIn
  • 纯函数可以异步吗?

    在浏览纯函数的定义时 它通常定义有两个特征 1 给定相同的输入应该产生相同的输出 2 不应产生任何副作用 这是否也意味着纯函数不应该是异步的 如果不是 怎么会这样 如果是的话 我很想看到 JavaScript 中异步纯函数的一些示例 是的
  • 为什么要使用 Python 进行函数式编程?

    在工作中 我们过去常常以非常标准的面向对象方式来编写 Python 程序 最近 有几个人加入了功能性潮流 他们的代码现在包含更多的 lambda map 和reduce 我知道函数式语言有利于并发性 但是函数式 Python 编程真的有助于
  • 如何使用 swift flatMap 从数组中过滤掉选项

    我对 flatMap 有点困惑 添加到 Swift 1 2 假设我有一些可选类型的数组 例如 let possibles Int nil 1 2 3 nil nil 4 5 在 Swift 1 1 中 我会做一个过滤器 然后是一个像这样的地
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • 如何使用符号来标识 ruby​​ 方法中的参数

    我正在学习 Rails 并回到 ruby 来了解 Rails 中的方法 以及 ruby 的实际工作原理 当我看到如下方法调用时 validates first name presence gt true 我有点迷惑不解了 如何在 ruby
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函

随机推荐

  • Android WebView LoadData - 土耳其字符

    如何在 webview 中将土耳其语字符 显示为 loadData 我的网络视图是 mWebView loadData detailsHtml text html UTF 8 thanks webView loadData htmlStr
  • 我需要进行哪些更改才能使 Magento 与 PHP 5.3 配合使用?

    我需要将我的服务器升级到 PHP 5 3 但安装了 Magento 而且我知道 Magento 不能很好地与 PHP 5 3 配合使用 我认为变化不会太大 根据我所读到的 但是 我想我应该向大众开放 有人成功做到这一点吗 如果是这样 你记好
  • 开关盒无法正常工作

    当我离开现场时 我发布了下面的代码ip空白 空并向其他字段赋值 toast总是给出消息KATimer is invalid or missing 我期望看到一个toast显示一条消息 指示空字段 但下面的代码 如果任何字段为空 它总是说KA
  • 有没有一种方法可以列出所有对象,例如使用同义词的视图?

    就像罐头上说的那样 如何确定哪些 SQL 对象正在使用给定的 SYNONYM 我想一种方法是搜索 PROC 或 VIEW 的所有内容并运行LIKE SYN NAME 但这看起来很笨拙 select from sys sql expressi
  • 如何在.NET MAUI 中创建可重用组件?

    我最近刚刚开始使用 Net MAUI 但现在我想知道如何使用一段代码 例如我的所有页面上都有一个自制的导航栏 因为在所有 10 个页面上编写相同的代码是没有意义的 我想知道是否有办法创建一个可以像 React 或 Angular 一样重用的
  • 使用 psycopg2 插入多行

    根据psycopg2 用一个查询插入多行 https stackoverflow com questions 8134602 psycopg2 insert multiple rows with one query 使用 psycopg2
  • Visual Studio Windows 窗体预览以不同的分辨率?

    我喜欢以 1680 x 1050 分辨率运行 Visual Studio 但是 我们的客户通常使用 1024 x 768 是否有某种方法可以使我的编辑器保持原始分辨率 但以不同的分辨率显示表单设计器 谢谢 Austin 我建议您购买一个额外
  • 如何获取 google+ 的公共数据以及如何使用 php 从我的网站发布到 google+

    我的网站和 google plus 之间的身份验证工作正常 但我的详细信息和我的活动现在没有显示 我们得到 Googleplus 的 getAccessToken 就像 access token ya29 AHES6ZSTauVKgrdDU
  • 继承后受保护的成员行为。

    我对受保护的标识符有一些疑问 在 K Sierra 编写的 Sun Certified Java Programmer Study Guide 的第一章中 我发现了以下信息 一旦包外子类继承了受保护的成员 该成员 由子类继承 就成为子类外部
  • 将 Pandas 数据帧转换为时间序列

    我有一个熊猫数据框 Out 57 lastrun rate 0 2013 11 04 12 15 02 0 1 2013 11 04 13 14 50 4 2 2013 11 04 14 14 48 10 3 2013 11 04 16 1
  • 迭代器的无限产量

    我正在尝试学习一些红宝石 想象一下 我正在循环并执行一个长时间运行的过程 在这个过程中 我希望获得一个旋转器 只要需要就可以 所以我可以这样做 a aNow 0 skip setup a big loop print a aNow aNow
  • 在 beautiful soup 中使用 lambda 函数

    尝试匹配包含某些文本的链接 我正在做 links soup find all a href lambda x org in x 但这会引发 TypeError argument of type NoneType is not iterabl
  • 如何设计一个同时安全的多用户 Ajax Web 应用程序

    我有一个网页 显示来自服务器的大量数据 通信是通过ajax完成的 每次用户交互并更改此数据 假设用户 A 重命名某些内容 时 它都会告诉服务器执行该操作 然后服务器返回新更改的数据 如果用户 B 同时访问该页面并创建一个新的数据对象 它将再
  • 添加依赖项和库 .jar 后无法解析 json import Intellij

    将在线源中的 json lib 2 4 jdk15 jar 添加到项目依赖项后 我似乎无法解决此问题 提供的屏幕截图显示了我正在做的事情的演练 是的 我多次尝试过 使缓存无效并重新启动 The error 这是我的项目结构 cmd 或 文件
  • 如果字符串中间出现空字符怎么办?

    我知道字符串的结尾由空字符表示 但我无法理解以下代码的输出 include
  • Google Analytics - 记录出站链接 - 打开新窗口

    我用过以下通过谷歌分析记录出站链接 是否可以在新窗口中打开链接 a href a
  • netty DefaultChannelPipeline 异常捕获

    不幸的是 我不明白 netty 服务器的输出 BUILD SUCCESSFUL Total time 3 seconds Jul 27 2014 2 04 44 AM io netty handler logging LoggingHand
  • SQLite 数据库的大小有限制吗?

    我读过他们的限制常见问题解答 他们谈论了除整个数据库的限制之外的许多限制 这很容易从实施限制 http www sqlite org limits html page SQLite 数据库文件按页面组织 每个页面的大小是 512 和 SQL
  • 找到 nlogn 算法的下界

    原来的问题在这里讨论 在 O n log n 时间内找到特殊点 k 的算法 https stackoverflow com questions 7626813 algorithm to find special point k in on
  • LISP 中的变量和符号有什么区别?

    从范围上来说 内存中的实际实现 语法 例如 if let a 1 a 是变量还是符号 约尔格的回答指出了正确的方向 让我补充一点 我将讨论与 Common Lisp 类似的 Lisp 作为数据结构的符号 符号是 Lisp 中真实的数据结构