一、Common Lisp 的宏(Macro)到底垃圾在哪?
Scribe 作者 Brain Reid 给出的 lexical macro 的原罪
Provide system designer with an excuse not to finish the design ("oh, that feature can be built with macros ...")
沒错,说的就是你, !
二、Common Lisp 的宏(Macro)到底神奇在哪?
理解这个问题我们先搞清一个常识。
- 编程语言的两个目标:代码的短小(简洁),程序的易读性
lisp宏的简短描述:可以编写lisp代码的函数。(lisp宏的本质是函数)
这个函数接收lisp代码,并对这些代码片段做操作,最终生成新的lisp代码。供后面程序调用执行。(也就是常提到的编写代码的代码 => 生成新的代码)
宏的行为如同函数对自身程序文本的变形。
-------------------------------程序进行自我编译时的代码重排,这是它的神奇之处-------------------------------
这已经可以解释宏的特别之处了,剩下的内容是解释上面的东西。
一般我们认为
程序 <==> 表达式+数据
而表达式一般是编程语言提供的基本语法,我们在具体业务上通过函数(或者其他的定义符)定义我们自己的逻辑来处理数据。其他语言的函数包括lisp的函数同样可以做到这点,但就像骑自行车从帝都到魔都,跟开传送在帝都与魔都间位移一样。两个方式都能在理论上达到目的,在事实的操作难易程度却存在很大差距。
在lisp中由于特殊的语法,表达式与数据的转换是如此浑然天成。
例:python在1.5版本后加入列表解析。
divisibleByTwo= [x for x in range(10) if x % 2 == 0]
这在1.5版本之前是不能使用的。但是我们通过其他方式可以达到目的。
divisibleByTwo = []
for x in range(10):
if x%2 == 0:
divisibleByTwo.append(x)
在lisp中可以这样做,我们定义一个叫做lcomp的宏。我们期望能达到这种效果
[x for x in range(10) if x % 2 == 0] ==> (lcomp x for x in (range 10) if (= (% x 2) 0))
代码如下:
(defmacro lcomp (expression for var in list conditional conditional-test)
;; create a unique variable name for the result
(let ((result (gensym)))
;; the arguments are really code so we can substitute them
;; store nil in the unique variable name generated above
`(let ((,result nil))
;; var is a variable name
;; list is the list literal we are suppose to iterate over
(loop for ,var in ,list
;; conditional is if or unless
;; conditioanl-test is (= (mod x 2) 0) in our examples
,conditional ,conditional-test
;; and this is the action from the earlier lisp example
;; result = result + [x] in python
do (setq ,result (append ,result (list ,expression))))
;; return the result
,result)))
在lisp解释器中就可以使用 (lcomp x for x in (range 10) if (= (mod x 2) 0))同样在lisp中也可以实现在python2.5中新加入的with语句。而不必等语言的实现者发布新版本后才可以使用。etc
为什么是宏而不是函数(有那些是宏能做而函数不能做的):
宏的参数在传递时不进行求值,而是以字面形式传递给宏的参数。宏的参数一旦传递完毕,就进行展开。展开宏的过程将一直进行到这段代码中的所有宏都展开完毕为止。宏完全展开完毕后,就和当初直接手写在此处的代码没有区别,也就是嵌入了这段代码上下文中,然后Lisp系统就对完整的代码上下文进行求值。
宏能控制宏调用中参数的求值,并且它可以展开进入到主调方的上下文中.
对于lisp来说,只要宏的名字能做到见文知意,宏的实现保证没有漏洞(或者能及时修复,这通常很容易实现)lisp代码就可以达到异常的短小,简洁。
-------------------------------------吐槽-----------------------------------
这也大大提高了门槛,因为修改代码需要你对程序的足够认识与扎实的功底。
对于其他语言,逻辑的不清尚且可以写出代码做测试,写了十几或几十行代码一步步弄懂逻辑,然后把前面的推倒。在lisp中几行代码就可以实现其他语言几何级的代码量,所以修改难度也是几何级的增长。
lisp写一些小脚本,别为难自己了,但是lisp对于大型项目,它可以做到你定义自己的语法,最终迭代成最适合你这个特定需求独特的语言。
对与lisp禅语:hi,lisp帮我把箱子打开吧,lisp: WTFK我需要拯救世界,lisp: 给我把魔杖对代码不保证编译通过。以上内容仅基于个人理解,请以专业内容为准。
What makes lisp macros so specialLisp Macrohttps://zh.wikipedia.org/zh-cn/Common_Lisphttps://zh.wikipedia.org/wiki/%E6%83%B0%E6%80%A7%E6%B1%82%E5%80%BC《on lisp》
三、CentOS下使用Common Lisp的详细指南
CentOS下使用Common Lisp的详细指南
Common Lisp是一种功能强大的编程语言,它的灵活性和可扩展性使得它成为许多开发者的首选。在CentOS操作系统上,安装和配置Common Lisp并不困难,本文将详细介绍如何在CentOS上使用Common Lisp。
1. 安装Common Lisp
在CentOS上安装Common Lisp非常简单。我们可以使用SBCL(Steel Bank Common Lisp)作为解释器。
请按照以下步骤进行安装:
- 打开终端并输入以下命令:
- 等待安装完成后,输入以下命令来验证安装是否成功:
sudo yum install sbcl
sbcl --version
2. 配置Common Lisp开发环境
安装完成后,我们需要配置Common Lisp的开发环境。
请按照以下步骤进行配置:
- 创建一个新的文件夹用于存储Common Lisp源代码:
- 在文件夹内创建一个新的文件,命名为
hello.lisp
: - 使用文本编辑器打开
hello.lisp
并添加以下代码: - 保存并关闭文件。
mkdir ~/lisp
touch ~/lisp/hello.lisp
(format t "Hello, World!")
3. 运行Common Lisp程序
现在我们可以尝试运行一个简单的Common Lisp程序。
- 打开终端并输入以下命令来启动Common Lisp解释器:
- 输入以下命令来加载并运行
hello.lisp
文件:
sbcl
(load "~/lisp/hello.lisp")
如果一切顺利,你将在终端中看到输出Hello, World!
。
4. 开始使用Common Lisp
现在,你已经成功在CentOS上安装和配置了Common Lisp,并运行了一个简单的程序。你可以开始编写和运行更复杂的Common Lisp代码,并利用Common Lisp强大的功能来解决你的编程问题。
希望本指南能够帮助你更好地在CentOS上使用Common Lisp。
感谢你阅读本文,希望本文对你在CentOS下使用Common Lisp有所帮助!
四、机器学习包括?
机器学习
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
五、什么是学习和机器学习?
机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是人工智能的核心,是使计算机具有智能的根本途径。
学习,是指通过阅读、听讲、思考、研究、实践等途径获得知识和技能的过程。学习分为狭义与广义两种:狭义:通过阅读、听讲、研究、观察、理解、探索、实验、实践等手段获得知识或技能的过程,是一种使个体可以得到持续变化(知识和技能,方法与过程,情感与价值的改善和升华)的行为方式。例如:通过学校教育获得知识的过程。广义:是人在生活过程中,通过获得经验而产生的行为或行为潜能的相对持久的方式。次广义学习指人类的学习。
六、机器学习是从哪里学习?
机器学习是从数据中学习的。它利用算法和统计模型来分析数据,发现数据中的模式和规律,从而生成预测模型和决策模型。
机器学习有监督学习、无监督学习和强化学习等不同的学习方式,可以应用于各种不同的领域,如自然语言处理、计算机视觉、音频信号处理和金融等。
机器学习的数据来源可以是结构化数据和非结构化数据,如图像、文本、音频和视频等。
七、机器学习高校排名?
清华大学,北京大学,中国人民大学,复旦大学
八、机器学习作者?
《机器学习》是清华大学出版社出版发行的书籍,作者是周志华。
九、机器自我学习原理?
机器学习是人工智能的一个子集。这项技术的主要任务是指导计算机从数据中学习,然后利用经验来改善自身的性能,不需要进行明确的编程。
在机器学习中,算法会不断进行训练,从大型数据集中发现模式和相关性,然后根据数据分析结果做出最佳决策和预测。
机器学习应用具有自我演进能力,它们获得的数据越多,准确性会越高。
十、机器学习就业待遇?
机器学习是一个热门领域,就业待遇相对较好。根据不同地区和公司的情况,机器学习岗位的平均薪资可能在每年5万-20万美元之间。大公司如谷歌、亚马逊、微软等,在机器学习领域有较高的薪资水平。
此外,机器学习专业人员往往具有广泛的职业发展机会,可以在各种领域应用机器学习技术,如金融、医疗、制造等。因此,机器学习就业待遇相对较好,但具体情况还取决于个人的技能、经验和地区。