zoukankan      html  css  js  c++  java
  • 我终于理解了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是具备元编程能力的典范语言』。
  • 相关阅读:
    移动硬盘无法识别提示需要格式化的解决办法
    Cassandra 入门(资料收集)
    [转] NoSQL生态系统
    软件项目实施问题收集(LastUpdatedOn:20141117)
    Sql server 收缩日志
    关于重构需要了解的一些原则
    C#定时任务采用线程和队列实现
    [转]我是如何带领团队开发项目的
    ASP.NET MVC 多套皮肤解决方案
    Mysql 问题汇总(不断更新中...)
  • 原文地址:https://www.cnblogs.com/zinthos/p/4082446.html
Copyright © 2011-2022 走看看