我终于理解了LISP『代码即数据|数据即代码』的含义

以前我一直不能理解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 是具备 元编程 能力的典范语言 』。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值