复合形式与特殊形式之间的区别

如何解决复合形式与特殊形式之间的区别

| 卢克·范德·哈特(Luke VanderHart)和斯图尔特·塞拉(Stuart Sierra)的《实用的Clojure》第19页第2章有一段, 特殊形式的定义:特殊形式是复合形式的一种特殊类型。在大多数情况下,它们的用法与函数调用非常相似。区别在于,特殊形式的第一种形式不是在某处定义的函数,而是Clojure内置的特殊系统形式。 第一个问题,这里的拼写单词是错字吗?这个词不是项目吗?如果没有,def是一种格式吗?这意味着该代码包含3种形式。 :-s 原因稍后,当撰写说明一个示例时,他使用了item。
(def message \"Hello,World!\")
分析第一种形式(定义消息\“ Hello,World!\”),您首先会看到它被括在括号中。因此,它是一个列表,将被评估为功能应用程序或特殊形式。列表中有三项:def,message和\“ Hello,World!\”。列表中的第一项def将是所调用的函数或特殊形式。在这种情况下,它是一种特殊形式。但是像一个函数一样,它需要两个参数-要定义的var和绑定它的值。评估此形式将创建一个变量,该变量将值\“ Hello,World!\”建立到符号消息的绑定。 *第二个问题,仅当列表的第一项是仅使用Clojure预先定义的内容时,复合形式才是特殊形式吗?如果是,那么可以创建自定义特殊表格吗?然后将定制复合表格称为特殊表格吗?因为根据定义,我的自定义不是内置在clojure中的东西,而是在其他地方定义的。 编辑: 我想我第一个问题的答案是不,这不是错字。 def是一种形式。 因为后来写到, 第二种形式(println消息)也是一个列表,这次是常规功能应用程序。它有两种组成形式-每个形式都是一个符号 这意味着(println message)>整个事物都是一种形式,它所拥有的其他所有事物(函数参数)也是一种形式。 但是,在一开始,作者说过,有四种基本形式的形式。 文字, 符号, 复合形式和 特殊形式。 根据书中符号的定义,它不是符号。 符号定义符号是可解析为值的形式。它们可能被认为与变量大致相似,尽管在技术上并不准确,因为它们实际上并不是以大多数语言中的变量相同的方式变量。在Clojure中,符号用于标识函数自变量以及全局或局部定义的值。以下各节将更详细地讨论符号及其分辨率。原因,编写def并按回车键会产生以下错误消息, def属于哪一类?     

解决方法

def是一种特殊形式。要了解原因,请考虑一下如何将def表达式作为函数来求值。当您输入类似(square(* x y))的表达式时,可以先评估子表达式(* x y),然后将square应用于任何表达式。 def不会发生这种情况,并且有充分的理由,您可以查看是否启动了REPL:
> (def a 1)

#\'user/a

> (def a 2)

...
接下来应该怎么办?如果def是正常函数,则REPL将对a求值,然后尝试将def应用于参数1和2:也就是说,它将尝试重新定义1。但是,您可能希望做的是定义符号\ “ a \”的值等于2(在过程中出现旧符号)。为了获得所需的行为,而def和少数其他内置函数(如果将它们作为函数进行评估会破坏这些内置过程),这些特殊形式要么编译到解释器中,要么实现为宏。     ,我写了那章。绝对可以写得更好,但是我将尝试清除它: 要回答您的第一个问题:是的,形式是正确的词。单个符号(例如
def
)仍然是表格,因为表格可以评估任何形式。有时我确实说“项目”,但这只是我用来在列表中指出“事物”的一个更通用的词。从技术上讲,如果它是用Clojure代码编写的并且可以评估,则它是一种形式。 对于您的第二个问题,不,复合形式是任何其他形式的基础。例如,如果我定义了这个:
(defn sq [x] (* x x))
然后叫它
(sq 3) => 9
表达式“ 5”是由两种其他形式组成的复合形式,第一种是符号“ 6”,将与您的函数等效,第二种是文字“ 7”。 “复合形式”一词不是正式的定义,也不是任何东西,这只是我可以想到的最简单的方式来表达形式可以由其他形式构建的事实。无论我在哪里想放
3
,在哪里都可以放
x
是合法的语法,在我可以放
x
的任何地方都可以放
(f x)
-因为它们都是形式。 为了回答您的最后一个问题,“ 2”是对编译器具有特殊含义的符号,因此在我在书中使用的术语中,它是一种特殊形式。     ,第一个问题: 是的-我认为“特殊格式的第一项”在这种情况下会更清楚。但是由于符号本身就是一种形式,因此将其称为“特殊形式的第一形式”在技术上也是正确的。 请注意,特殊名称的第一项本身有时也称为特殊格式,例如“ def是特殊格式”。我认为这里的术语有些混乱,但是只要您了解特殊形式的概念,通常就可以清楚理解这是什么意思。通常,如果您认为“特殊形式”是指整个形式,那将是正确的。 关于Lisp表单定义的问题在这里很有帮助。 第二个问题 是的-仅当第一个符号是Clojure中预定义的特殊格式符号之一时,才存在特殊格式。有关有用的列表,请参见http://clojure.org/special_forms。 您目前无法定义自己的特殊格式-尽管可以针对所有实际用途使用宏或函数获得类似的结果,所以这绝不是问题。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-