以前我一直不能理解LISP里引用的作用,感觉引用和字符串没什么区别。
比如:
> (define (func)
'ok)
> (func)
'ok
这里把引用ok当做了函数func的返回值。
但是我在实现函数式汉语编程的时候,我把代码构造成了一个多叉的语法树,这时候对某一段代码的引用,就是不对代码Eval,直接返回语法树的根节点。
类似于:
> '(car (a b))
'(car (a b))
可是LISP中的引用实际上是一个construct,它可以被car、cdr。
即:
> (car '(car (a b)))
可是LISP中的引用实际上是一个construct,它可以被car、cdr。
即:
> (car '(car (a b)))
'car
> (cdr '(car (a b)))
'((a b))
这下子就不科学了,之前说过在我的实现中,引用是代码的语法树,而construct是数据中的一个结构, 引用怎么能被当做construct来处理呢。
只能有一个解释,在LISP中『代码』也是『数据』。
那么LISP中的『代码即数据』有什么用呢?
回忆一下元编程的定义:元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。
所以LISP中的代码可以用来做元编程!
马上开始试验:
在这里『数据』被当做了『代码』, 所以说『LISP是具备元编程能力的典范语言』。
这下子就不科学了,之前说过在我的实现中,引用是代码的语法树,而construct是数据中的一个结构, 引用怎么能被当做construct来处理呢。
只能有一个解释,在LISP中『代码』也是『数据』。
那么LISP中的『代码即数据』有什么用呢?
回忆一下元编程的定义:元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。
所以LISP中的代码可以用来做元编程!
马上开始试验:
> (define quoteList '(1 2 3 4)) ;定义一个变量,是一个列表(1 2 3 4)的引用
> (define quoteOp '+) ;定义一个+运算符的引用
> (define (gao op exp) ;定义一个函数gao,他接受两个参数op和exp,把op和exp组合起来,然后把结果的数据当做代码来运行
(eval (cons op exp)))
> (gao quoteOp quoteList)
传递参数给gao,首先(cons op exp),返回'(+ 1 2 3 4),之后『运行』这个『数据』。在这里『数据』被当做了『代码』, 所以说『LISP是具备元编程能力的典范语言』。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
· 重磅发布!DeepSeek 微调秘籍揭秘,一键解锁升级版全家桶,AI 玩家必备神器!