为什么“无人问津”的Lisp可以这么狂?

Lisp永远成不了编程主流语言 简单说,Lisp语言违反了人类人性中对事物多样性的需求而不能成为编程语言中的主流。 阅读详情

640?wx_fmt=jpeg

一到周末,Hello World 咖啡馆就比平时热闹得多, 各种语言都来到这里,互相打探对方的最新特性,看看自己能不能借鉴一些。 

这天晚上,由于Lisp的到来,咖啡馆的气氛显得格外热烈。 

Lisp

Lisp身穿一身时髦又奇异的括号服装, 和Clojure, Scala等几个函数式编程的忠实拥趸坐在一桌,谈笑风声,时不时挖苦一下隔壁的几个人,那里坐着以C语言为首的几个大佬。 

他悠闲地端起了一杯咖啡,悠悠地说道:“听说Java也用上了函数式编程? ”

Clojure道:“是啊,加上去没多久,好多人还没用熟呢!”

Lisp不屑地说道:“加上了也没用,不是我瞧不起他们,表达能力实在是太弱了!”

隔壁的C语言早就憋了一肚子火, 听到这句话,忍不住说道:“你嘚瑟什么呀,我知道你是基于Lambda演算的,但我们是基于图灵机的啊, 上世纪已经证明这图灵机和Lambda演算是等价的,所以我们的能力是一样的。 对了,你知不知道什么是图灵机,以及他的实现冯诺依曼架构啊?”

Lisp懒懒地说:“没兴趣了解,理论上计算能力是等价的,但并不代表在语言层面的表示一样,比如说,在我这里非常自然的函数式编程,在你们那里看起来就很别扭,是不是啊Java老弟?” 

Java有点不好意思,他很清楚,自己的函数式编程就是一个半吊子,所谓的Lambda表达式就是个接口实现而已。

(详情参见:《Lambda表达式有什么用?》)

Python出来解围:“ 我这里支持得很好啊,  我可以把函数当做参数进行传递,可以把函数当做返回值返回,还可以把函数保存到数据结构中!高阶函数map, reduce用起来也贼爽。”

JavaScript接口道:“我也是啊!”

程序就是数据

Lisp 笑了一下,接着问道:“你们能在运行时创建新的函数吗?”

Java 看到展示自己的机会来了,马上接口道:“怎么不能? 在程序运行的时候,我可以通过操作Java字节码的方法,动态地生成函数和类,人们经常说的AOP就是这么玩的。”

Lisp很不屑:“还操纵字节码,还AOP,麻烦不麻烦!  低级不低级!丢人不丢人! ”

Java一脸愕然。

Lisp开始放大招: “你们能不能写个函数,把代码传递进去,然后对代码进行修改,然后返回新的代码?”

一个修改代码的函数?  代码可以在运行时修改? 这不是自虐吗?

“哈哈,这你们就不懂了吧, 凭什么数据结构可以变化,并且其中的数据可以修改,而程序却不能呢?在我这里,代码就是数据,代码可以在运行时被修改。”  Lisp很得意。

JavaScript愤愤地说:“这有什么鸟用?”

Lisp看了看身边的Java ,又拿他开刀:“就拿你来举例吧, 你最早只有for 循环,没有for each 循环, 就是下面这样, 是不是被很多人骂啊?”

普通for 循环

for(int i=0;i<persons.size();i++){
    Person p = persons.get(i);
    System.out.println(p);
}

for each 循环

for (Person p : perons){
     System.out.println(p);
}

Java无奈地点点头,Lisp说的是实话。

“这就是了,要想把这个新的语法给加上,那必须得在语言层面修改才行,对吧? 语言不支持,程序员骂也没用。 但是在我Lisp里就不一样了,根本就不用改动语言,一个程序员就能把这个新的语法给加上,并且新的for each 和 老的for 处于同等地位,相当于语言被扩展了。 ”

“不会吧,你怎么实现?” 

“自然是使用宏(Macro)了!”

“什么是宏? 和C老大的宏一样吗?” Java问道。

“C语言的宏就是编译期的文本替换而已,怎么能和我的宏相比? 给你说你也听不懂,通俗点说宏也是程序员写的代码, 运行时可以把代码传递给宏,然后宏可以修改这段代码,返回新的代码。 拿刚才的例子来说,假设for是个函数,程序员可以写一个for-each 的宏,在这个宏中,修改/扩展for函数的代码,实现for each的功能。”

C语言若有所思:“嗯,看来在你这里,程序也是数据啊,可以任意操作,果然厉害。如果把一段程序看成是抽象语法树(AST),那这个宏就相当于把AST做了修改,形成了新的AST。”

640?wx_fmt=png

Lisp心想,这老家伙还不赖, 已经Get到了。  

他说:“你们老是笑话我的括号多,但是你们不明白的是,这恰恰是我最大的优势,因为在我这里,数据和程序表示的方式是一致的,都是list,比如这一段简单的循环。”

(loop for x in '(1 2 3 4 5)
      do (print x) )

大家一看,果然如此,这代码(loop函数)是用括号括起来的一个List, 这数据(1 2 3 4 5)也是一个List。

Lisp说:“List的好处就是天然可以和AST对应,这就方便宏来操作了。”

640?wx_fmt=png

开发语言的语言

JavaScript说:“我还是看不出有什么用?”

Lisp接着说:“正是由于程序可以当做数据来处理,程序员可以无限地扩充Lisp,把Lisp变成他们所在领域的语言,使用这个领域特定的语言来编程,那简直是如虎添翼,例如这个例子,通过扩展Lisp,   Lisp和SQL语言完美地融合了。 ”

(select [age] :from [employee] :where [> [salary] 50000])

“再比如说, 在座的各位大都支持面向对象编程,对我来说,在我这里实现OOP也是小菜一碟,比如Common Lisp中的CLOS,就是用宏实现的OOP操作集。”

大家都表示很好奇, Lisp就展示了几行代码:

定义一个叫Person的类

(defclass person ()
  ((name :accessor person-name
           :initarg :name)
   (age :accessor person-age
           :initarg :age)))

创建一个person对象

(setf p (make-instance 'person :name "andy" :age 10))

访问对象的属性

(print (person-name p))

看到这里,大家都自愧弗如了, 这Lisp真有狂的资本啊。 

C 语言说到:“看来你Lisp是用来开发其他语言的语言啊!”

Lisp笑道:“这句话不错,在我这里,语言和程序之间的界限是非常模糊的。”

最后的反击

C语言问了最后一个问题:“既然你这么牛? 为什么用的人这么少?”

Lisp站起身来,叹了一口气:“有人说学起来门槛太高;有人说灵活与强大是一把双刃剑,每个人都能造属于自己的领域特定语言,让别人难以理解和维护;还有人说Lisp方言很多,社区分裂,没有统一的库让新手学习使用。 谁知道呢?”

说完Lisp便离开了,只留下一个满是括号的背影。

最新热门文章

为什么学习编程要从Web开始?

我是一个线程

我是一个Java Class

CPU阿甘

面向对象圣经

TCP/IP之大明邮差

负载均衡的原理

一个故事讲完HTTPs

编程语言的巅峰

JavaScript:一个屌丝的逆袭

640?wx_fmt=jpeg

编程语言这么多,偏偏C语言成了大学的必修课!就因为二级吗? “我不是学计算机的,为啥要学C语言?”如果把学C语言的精力用来学学其它与专业相关度更高的东西,是不是会更好呢?既然如此,干嘛还学C语言呢? 大学里除了要拿到“毕业证”和“学位证”以外,还要过“四级”和“二级”,否则可能会被扣发两证,或找工作受阻,难以“落户”等。这里的二级指的是“全国计算机等级考试二级”,是一个面向“程序员”,“考核计算机基础知识和使用一种高级计算机语言编写程序以及上机调试的基本技能”的考试。虽然社会只需要少量的人会编程序,但莫名其妙的是几乎所有的大学生都想(或被要求)过二级,导致程序 阅读详情

相关推荐

关于Lisp的一己之见

Lisp是一种计算机编程语言,由约翰·麦卡锡(John McCarthy)于1958年发明。“Lisp”这个名称是“List Processing”的缩写,具有表处理的意思…以上大概是公认的比较权威的介绍,网络上很多资料大概都是这么讲的。从这些信息中可以看出,Lisp应该是一种和C、Java类似的计算机编程语言,是一种和中文、英文等所谓自然语言不同的、用来给计算机编程的语言,这或许是大部分人对它的印象。然而,在学习Lisp的过程中,感受到了很多与编程语言常识相背的地方,产生了一些感想,本文就表达一些自己对L

乐征skyline 3660

lisp语言代替python_为什么lisp这么强大的语言用的人这么少-阿里云开发者社区

再一次学习了lisp语言,再一次被lisp的强大震撼.虽然一直没有用lisp做什么东西,但每一次学习都能帮助领会其他语言的脉络.Lisp is a language for doing what you've been told is impossible.— Kent Pitman创造力语言是和人相关的,真正有创造力的人不多,大部分人都是应用.语言的核心人物如果不创造出来方便普通人应用的基础,那...

weixin_39850167的博客 951

lisp程序书写 中望cad_CAD创建Lisp程序步骤

【字体:小大】a>本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCAD中的加载和运行的方法。首先来创建一个最简单的LISP程序—-―Hello.lsp‖,在AutoCAD2002中加载并运行该程序,将会在命令行出现-―Hello,VisualLISP!‖。36.2.1VisualLISP与AutoCAD的通信用户可以直接在A...

weixin_39673002的博客 1316

百花齐放!了解那些比较冷门的编程语言

这个有趣的编程语言的话,大概还分两种,一种是实际应用中真正用来应用的,而另外一种,是纯粹娱乐的,真正应用是用不到,也用不了的。 冷门语言的第一大流派,首屈一指应当算是LISP了。虽然说LISP冷门,但是绝对是冷门中的霸主(还是冷门)。而且论资排辈,LISP是世界上至今还在使用的高级编程语言中第二老的(FORTRAN第一),由人工智能之父John McCarthy于1958年设计并实现。和UNIX一...

weixin_45797022的博客 1688

Lisp:一门不断演进的编程语言

Lisp以其强大的元编程编程能力和函数式编程范式而闻名,这编程能力和函数式编程范式而闻名,这使得它在人工智能、自然语言处理和符号编程能力和函数式编程范式而闻名,这使得它在人工智能、自然语言处理和符号计算等领域中得到广泛应用。事实上,Lisp语言一直在不断发展和改进,并适应了现代编程环境和需求。虽然有人认为Lisp永远无法成为编程主流语言,但这种观点可能忽视了Lisp语言本身的优势和不断的演进编程能力和函数式编程范式而闻名,这使得它在人工智能、自然语言处理和符号计算等领域中得到广泛应用。

YdvCss的博客 226

vue3的面试题

vue3的面试题

jiang7701037的博客 6265

为什么Lisp如此先进,却永远成为不了编程主流语言?深度解析Lisp的优势与劣势

Lisp 的争议 由于 Lisp 语言的 “过于灵活而神秘存在” 的特性使得 Lisp 成了世界上最受争议的编程语言,实际上独树一帜的 Lisp 也在(针对不同的产品,总有热衷「语言比较」的人们引发语言优势性的争论)类的问题得到庇护,因为 Lisp 语言本身不是针对开发项目而诞生的语言,这种性质完美的避开了针对项目类型而友好的语言之间的比较话题。尽管如此,还有很多人用「Lisp 永远成不了编程主流语言」来反驳极少 Hacker 所说的「Lisp 是 Hacker 们最好的神器」。 虽然 「Lisp 永远成为

Viper的程序员修炼手册 1万+

10.2 在新能源、储能及电网节点的应用实践

构网型变流器技术在电力系统中的应用进展 构网型变流器技术正从理论研究走向规模化工程应用,为新能源并网提供主动支撑能力。该技术在光伏电站采用"部分构网"混合架构,由构网单元实现黑启动和弱网稳定;在风电场利用叶轮动能提供惯量响应。储能系统是理想的构网载体,可提供快速调频和动态电压支撑。在电网节点,构网型STATCOM可增强弱电网电压稳定性,大容量变流器可替代传统调相机。当前面临标准滞后、宽频振荡风险等共性挑战,需在可靠性、经济性间取得平衡。系统级协调控制和精确阻抗建模是应用成功的关键。

技术工作者 1110

Lisp语言是什么?为什么保罗·格雷厄姆极力推荐 Lisp?

保罗的书如《On Lisp》和《ANSI Common Lisp》就是这种深浅结合的典范:新手学语法,专家学高级宏技巧。他甚至开发了 Arc,一种 Lisp 方言,来简化 Lisp。

阿正的梦工坊 1554

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1652

C语言实现AES加解密

C语言实现AES加解密 #include<stdio.h> #include<string.h> #include<time.h> #include<windows.h> #define Nb 4 //数据块行数 #define Nk 4 //密码块行数 #define Nr 10 //轮加密次数 unsigned char RoundKey[4*Nb*(Nr+1)]; //轮密钥 unsigned char Key[17];

qq_44310495的博客 8890

20、为什么选择Lisp?

本文探讨了Lisp语言及其现代变种Hy在编程和研究中的应用优势。通过Hy的简洁语法和强大功能,可以轻松实现Web开发、网络爬虫、深度学习模型、自然语言处理及知识图谱创建等多种复杂应用,同时保持代码的优雅与高效。文章结合实际案例展示了Hy如何利用Python生态系统进行灵活开发,并总结了其在商业产品开发中的潜力。

weixin_35749786的博客 991

【AI智能体】Codex 浏览器操作自动化任务实战操作详解

【AI智能体】Codex 浏览器操作自动化任务实战操作详解

congge 4124

Lisp的“失败”就是由于它太成功了

我学习Lisp的主要原因是受了那些大神的蛊惑,说它是有史以来最强大的语言,厉害的程序员都用Lisp...... 于是我也心痒痒地去学了。刚开始的时候,主要是忍受着它那前缀...

码农翻身 2996

深度学习部署工程师--8(docker+TensorRT部署到推理+yolo人体检测)下

本文介绍了YOLOv5模型通过TensorRT加速部署的流程。首先需要检查磁盘空间,确保有30GB可用。文章对比了不同推理方式的性能:int8量化+TensorRT可达200FPS,纯TensorRT为166FPS,CUDA为147FPS,CPU为93FPS。重点讲解了将YOLOv5模型导出为ONNX格式的详细步骤,包括修改Detect类的forward方法以移除decode运算,使用git patch批量修改代码,安装必要的依赖库,以及通过onnx-graphsurgeon工具修改ONNX图结构。最终目标

FJN110的博客 494

Nexys4DDR+OV7670实现图像灰度显示系统嵌入式

通过对硬件平台的准备、Vivado工程配置、OV7670驱动程序的编写、图像灰度处理算法的设计以及系统集成与测试,我们成功实现了一个基于嵌入式系统的图像处理应用。当系统运行时,OV7670摄像头模块将采集到的图像传输到FPGA芯片中,然后通过图像灰度处理算法将彩色图像转换为黑白图像,并在显示设备上进行显示。OV7670摄像头模块的驱动程序是实现图像采集的核心。以上代码中,我们使用了Xilinx提供的XGpio和Xil_In32函数来进行OV7670摄像头数据的读取和GPIO的初始化。OV7670驱动程序。

WangWEel的博客 338

为什么 Ruby 是一种受欢迎的 LISP

为什么 Ruby 是一种受欢迎的 LISP 译言网 | 为什么 Ruby 是一种受欢迎的 LISP为什么 Ruby 是一种受欢迎的 LISP于2007-08-13 04:55:38翻译 | 已有7441人浏览 | 有4人评论几年之前,我考虑过 Ruby 并决定忽视...

285

Android 13.0 设置默认屏幕亮度百分比

在13.0的系统ROM产品开发中,在一些产品开发中,对于设置默认屏幕亮度和屏幕亮度百分比的功能,在开发中也是常见的功能,在10.0的平台设置可能有一些不同,一般的都是在SettingProvider中设置就可以了 在11.0以后的系统中设置默认屏幕亮度的方法就不同了,接下来具体分析功能的实现

安卓兼职framework和app工程师的博客 1560

Lisp语言的区块链

Lisp(LISt Processing)是于1958年开发的一种编程语言,因其基于表的结构和强大的宏系统而闻名。Lisp的语法极其简单,几乎所有的代码都是由括号和列表构成,这赋予了它极高的灵活性和可扩展性。此外,Lisp支持多种编程范式,包括函数式编程和面向对象编程,这使得它在处理复杂问题时尤为高效。区块链是一种分布式数据库技术,其核心是通过去中心化的方式来记录和存储数据。每个区块包含一系列交易记录,并通过密码学算法将其链接到前一个区块,从而形成一条不可篡改的链。去中心化。

2501_90466896的博客 2047

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

初试Lisp语言

Lisp是一种非常强大且灵活的编程语言,它的许多概念和特性对现代编程语言产生了深远的影响。通过今天的入门介绍,希望你能对Lisp有一个基本的了解,并激发你进一步探索和学习Lisp的兴趣。

howard2005的专栏 927

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

为什么Lisp程序员总能碾压其他人?

每一个看到Lisp代码的人,都会觉得Lisp那无休无止的括号实在是太诡异了。但是,Lisp的伟大之处恰恰就在哪些括号中!为什么会这样?今天,我将带领大家走向顿悟的旅程。假设我们要写一个画图的程序,可以在屏幕上画点东西。用JavaScript来写的话,可能就会有这些函数: 非常简单和清晰,对吧?现在来一点挑战:能不能支持远程画图呢?远程画图是说一个用户可以发送指令到你的电脑上,你的电脑执行指令,显示画图结果。我们该怎么做呢?可以使用websocket,从远程用户那里接收指令。 Eval 接收到指令以

程序员高级码农的博客 1078

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

为什么Lisp语言如此先进?

为什么Lisp语言如此先进? 作者:Paul Graham 译者:阮一峰 英文原文:Revenge of the Nerds (节选自即将出版的《黑客与画家》中译本) 一、 如果我们把流行的编程语言,以这样的顺序排列:Java、Perl、Python、Ruby。你会发现,排在越后面的语言,越像Lisp。 Python模仿Lisp,甚至把许多Lisp

lonerdai的专栏 611

lisp语言代替python_Lisp 语言优点那么多,为什么国内很少运用?

为什么Lisp没有流行起来本文探讨的是为什么Lisp语言不再被广泛使用的。很久以前,这种语言站在计算机科学研究的前沿,特别是人工智能的研究方面。现在,它很少被用到,这一切并不是因为古老,类似古老的语言却被广泛应用.其他类似的古老的语言有 FORTRAN, COBOL, LISP, BASIC, 和ALGOL 家族,这些语言的唯一不同之处在于,他们为谁设计,FORTRAN是为科学家和工程师设计的,他...

weixin_39996101的博客 368

Lisp语言和Lisp哲学

哲学,更适合需要高度抽象和快速原型迭代的领域(如 AI、编译器设计)。尽管在工业界应用有限,但 Lisp 思想已渗透到现代编程的基因中,成为计算机科学的“元语言”智慧。Lisp 的哲学挑战了传统编程语言的设计范式,其影响深远却常被低估。现代 Lisp 实现(如 SBCL)通过类型注解和编译优化提升速度,但仍难以匹敌静态类型语言(如 C++)。的装饰器(Decorator)本质是语法糖,类似 Lisp 宏的简化版。,深刻影响了计算机科学的发展。Lisp 的代码本身由嵌套的列表构成,与数据共享同一结构。

qq_39580065的博客 904
上一篇: 来,聊聊程序员的爱情
下一篇: 我发现一个新的软件,用自然语言编程!非常酷!
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值