cyendra

Azarath Metrion Zinthos

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  49 随笔 :: 0 文章 :: 8 评论 :: 69140 阅读

以前我一直不能理解LISP里引用的作用,感觉引用和字符串没什么区别。
比如:
> (define (func)

    'ok)
> (func)
'ok
这里把引用ok当做了函数func的返回值。

但是我在实现函数式汉语编程的时候,我把代码构造成了一个多叉的语法树,这时候对某一段代码的引用,就是不对代码Eval,直接返回语法树的根节点。
类似于:
 > '(car (a b))

'(car (a b))
可是LISP中的引用实际上是一个construct,它可以被car、cdr。
即:
> (car '(car (a b)))
'car
> (cdr '(car (a b)))
'((a b))
这下子就不科学了,之前说过在我的实现中,引用是代码的语法树,而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是具备元编程能力的典范语言』。
posted on   cyendra  阅读(4678)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
· 重磅发布!DeepSeek 微调秘籍揭秘,一键解锁升级版全家桶,AI 玩家必备神器!
点击右上角即可分享
微信分享提示