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

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

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

刚开始的时候,主要是忍受着它那前缀表达式和大量的括号,去学习它的函数式编程,这时候没觉得Lisp有多厉害,等到学到了宏(macro)这个主题的时候,就被Lisp的变态的能力真正地震撼了:这不是一门简单的编程语言,它是一门创造其他语言的语言,尤其是把代码当成数据来处理,实在是刷新三观。

大家经常用Java中的循环来做距离,最早的时候它只有for循环,没有for each ,用起来很不爽。

Java程序员也没有办法,只能眼巴巴地看着别的语言的for-each,与此同时祈祷下一版的JDK中也有这个特性。

但是对于Lisp程序员,这就是小菜一碟,你不是没有for-each 吗, 我用宏自己写一个,然后直接就可以用了,更牛X的是这个新写的for-each 和Lisp中其他的关键字具备同等地位,相当于把语言增强了。

就是由于这种变态的元编程能力, “Lisp 赋予了你自定义操作符的自由,因而你得以随心所欲地将它塑造成你所需要的语言。如果你在写一个文本编辑器,那么可以把 Lisp 转换成专门写文本编辑器的语言。如果你在编写 CAD ,那么可以把 Lisp 转换成专用于写 CAD 程序的语言。”  --- Paul Graham 《On Lisp》。

你还可以把Lisp转换为专门用于处理订单的语言,专门用于查询数据库的语言...... 这是不是非常酷?

文本编辑器,CAD,订单,数据库查询就是所谓的业务领域(Domain),Lisp可以变成领域特地语言,即DSL(Domain Specific Language)。

Lisp在制造别的语言(DSL)时是如此的成功,以至于它最终走向了“失败”。

很多语言解决问题的思路是分而治之:把一个大任务拆分成一个个小任务,再把小任务拆分成更小的任务,然后去编码实现。

Lisp则有着截然不同的思路,由于其强大的能力,Lisp程序员倾向于改造Lisp,把这门语言改造成一个问题领域相关的语言,即DSL ,然后用这个DSL来轻松编程,去解决问题。

当然这个改造的过程是个渐进式的:

“在编程的时候你可能会想 'Lisp 要是有这样或者那样的操作符就好了。' 那你就可以直接去实现它。之后,你会意识到使用新的操作符也可以简化程序中另一部分的设计,如此种种。语言和程序一同演进。就像交战两国的边界一样,语言和程序的界限不断地移动,直到最终沿着山脉和河流确定下来,这也就是你要解决的问题本身的自然边界。最后你的程序看起来就好像语言就是为解决它而设计的。并且当语言和程序彼此都配合得非常完美时,你得到的将是清晰、简短和高效的代码。”    --- Paul Graham 《On Lisp》。

这种使用DSL去解决问题的方法有什么问题呢?

碎片化!  会出现很多“小语言”,这些语言之间有细微的不同,这就是为什么你的Lisp代码对别人来说读起来很吃力的原因。 

而其他语言则不存在这个问题,相对容易去理解代码的含义。Lisp, 由于其变态的表达能力, 一个符号可能是个变量,函数,操作符。你需要花费大量时间去阅读代码才能搞清楚它到底是什么含义,这就太悲催了。

Lisp的“失败”的一大原因就是它的碎片化,而碎片化又源于语言本身的特性和它那用DSL解决问题的风格。

注意,我在说“失败”的时候,一直用引号, Lisp真的失败了吗?No!Lisp的思想已经进入到了现在主流的语言中,无论是Python,JavaScript,甚至Java都具备函数式编程的能力,还有像Scala这样既能OOP,又能FP的语言。

但是,Lisp那强大的宏,那运行时改变自身的能力并没有被其他语言接受,Ruby比较接近,但是差得还很远。可能大家害怕这个双刃剑了吧!

640?wx_fmt=gif


码农翻身公众号开放投稿,可能是全网最高片酬:

用故事讲技术 ,稿费1000

技术/职场/感悟/面试等,稿费700

翻译类文章,每千字200

联系方式:onlyliuxin97(微信)

详情猛戳: 可能是全网最高片酬,速来!

往期精彩回顾

我是一个线程

我是一个Java Class

面向对象圣经

函数式编程圣经

TCP/IP之大明邮差

CPU阿甘

我是一个网卡

我是一个路由器

一个故事讲完HTTPs

编程语言的巅峰

Java:一个帝国的诞生

JavaScript:一个屌丝的逆袭

负载均衡的原理

阅读源码的三种境界

640?wx_fmt=jpeg

51单片机通过sp485ee和电脑通讯 首先说一下接线的方法,下图就是正确的接线方法,51单片机的P3.0口接sp485的1口RO。sp485的8口接正5V,sp485的5口接地。sp485的6口接usb转485的A,sp485的7口接usb转485的B,usb转485插到电脑的usb口上。和上次的串口控制P2灯的程序一样,只是为了验证一下,电脑发送的数据,单片机能不能正常正确接收。接好线后的图片,多接了一个led灯,用来响应电脑发出的指令。 阅读详情

相关推荐

51单片机-串口通信(串口向电脑发送信息&电脑通过串口控制LED)

51单片机-串口通信(串口向电脑发送信息&电脑通过串口控制LED)

cyaya6的博客 4万+

lisp学习历程

经过一段时间的LISP学习,对LISP有了更深入的了解和认识。回顾自己的学习历程,总结经验和教训,可以为未来的学习和成长提供宝贵的参考。同时,也要保持对新技术和新知识的关注,不断拓展自己的视野和知识面。👨‍💻博主Python老吕评论,您的举手之劳将对我提供了无限的写作动力!🤞🔥《跟老吕学Python编程》《Python游戏开发实战讲解》《Python Web开发实战》《Python网络爬虫实战》《Python APP开发实战》🌐《HTML》《CSS》《Vue》💻《C语言》《C++语言》

Python老吕的博客 1663

MATLAB与51单片机进行串口通信详解

目录一、51单片机与电脑进行串口通信二、MATLAB串口通信函数三、串口属性四、示例Demo4.1 MATLAB接收单片机发来的数据4.2 MATLAB向单片机发送数据控制LED五、总结 一、51单片机与电脑进行串口通信 关于51单片机与电脑进行串口通信在前文已经介绍过了,有兴趣的可以参考文章:51单片机之串口通信详解及代码示例。 二、MATLAB串口通信函数 Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创

Wendy的博客 1万+

Lisp 语言入门教程(一)

Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。Lisp 的核心思想是“代码即数据,数据即代码”。在 Lisp 中,代码是由列表(list)构成的,而列表的本质是括号包裹的表达式。典型的 Lisp 表达式格式如下: 例如, 表示“1 加 2”,相当于其他编程语言中的 。Lisp 支持多种数据类型,最常用的有:Lisp 中提供了简单

知道者 2385

「新的LISP编程入门指南」——详细教程与示例代码

newLISP是一种现代化的LISP方言,它提供了简单易用的语法和强大的功能。newLISP是一种现代化的LISP方言,它提供了简单易用的语法和强大的功能。在newLISP中,表达式由列表构成,列表的第一个元素是函数名,其余元素是函数的参数。在newLISP中,表达式由列表构成,列表的第一个元素是函数名,其余元素是函数的参数。在newLISP中,条件语句使用"if"函数。在newLISP中,您可以使用"define"函数定义自己的函数。在newLISP中,您可以使用"define"函数定义自己的函数。

TechChamp的博客 1761

LISP教程:使用LISP编写简单的程序

是调用刚刚定义的函数的代码。定义了一个名为 “greet” 的函数,该函数接受一个参数 “name”。定义了一个名为 “greet” 的函数,该函数接受一个参数 “name”。定义了一个名为 “greet” 的函数,该函数接受一个参数 “name”。定义了一个名为 “greet” 的函数,该函数接受一个参数 “name”。定义了一个名为 “greet” 的函数,该函数接受一个参数 “name”。定义了一个名为 “greet” 的函数,该函数接受一个参数 “name”。是调用刚刚定义的函数的代码。

YdvCss的博客 865

单片机接usb设备不用计算机,如何利用usb转串口实现单片机和电脑的通信

写这篇博客,首先检讨一下自己,因为以前串口的程序,也和步进电机一样,时灵时不灵,我现在终于知道这是为什么了,因为51上有三个串口,一个公口,一个母口,一个usb转串口,这样的话,串口有3个了,我手头上有usb转串口线,也就是平时用来下程序的那根线,还有一个母口的线,今天我很纠结这两个的驱动,因为今天用usb转串口线,可以实现单片机和电脑的通信,但是用母口线,奇怪的是他并没有想象中的那种效果,更奇葩...

weixin_29839415的博客 1499

51单片机连接开发板时,电脑设备管理器找不到接口,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1795

51单片机、STM32连接串口助手常遇到的问题有哪些,具体应该如何解决

如果选择了错误的串口号,会导致无法连接或通信失败。解决方法是确认单片机或STM32连接到电脑时所使用的串口号,并在串口助手中选择相应的串口号。解决方法是确认单片机或STM32与电脑之间所使用的波特率,并在串口助手中设置相同的波特率。在这个例程中,我们假设使用的是51单片机的UART0串口和STM32的USART1串口进行通信。解决方法是确认其他串口设备是否在占用相同的串口资源,如有冲突,可以更换串口号或断开其他串口设备。解决方法是安装正确的串口驱动程序,通常可以从芯片厂商的官方网站上下载到相应的驱动程序。

Kyle_Chan_zMH的博客 6028

Vivado与VCS+Verdi联合仿真环境搭建全攻略

本文详细介绍了如何搭建Vivado与VCS+Verdi联合仿真环境,旨在解决Vivado Simulator在大型FPGA验证中速度慢、调试弱的问题。通过指导工具版本配对、环境变量设置、关键参数配置及Xilinx仿真库编译,帮助工程师高效整合Vivado的设计管理、VCS的高速仿真与Verdi的深度调试能力,从而显著提升验证效率。

weixin_29219189的博客 577

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

本文详细介绍了从Design Compiler(DC)过渡到DC Topographical(DCT)和DC Graphical(DCG)的完整操作框架,特别针对DEF文件处理提供避坑方案。通过环境准备、工具升级、DEF文件处理、DCG综合配置等步骤,帮助开发者高效应对28nm以下工艺节点的物理感知综合挑战,显著提升时序收敛效率。

weixin_27966471的博客 381

【51单片机】单片机与串口通信

通过本次实验,我深刻体会到了理论与实践相结合的重要性。在实验过程中,我不仅加深了对相关理论知识的理解,还提高了自己的实践操作能力。同时,我也学会了如何分析和解决实验中遇到的问题,这对我的学习和工作都具有重要的意义。以上则是我此次的实验内容,如有错漏请各位大佬多多指教!

weixin_72935906的博客 3923

拥有AI助手便能解放双手?——抖音直播脚本的生成

科技改变生活,AI助手帮你完成抖音创作!

Scientist_的博客 2352

51单片机快速入门之中断的应用 2024/11/23 串口中断

表示数据 发送成功 一帧数据 触发中断处理 之后需要手动 =0。表示数据 接收成功 一帧数据 触发中断处理 之后需要手动 =0。RXD串口信息过来,当接收到起始信号,SCON寄存器将打开接收,允许接收,通过。SM0 SM1 串行通信 模式选择 ,参考前面文章中的。只需要把数据写入SBUF中即可发送。关于 通信模式 设置 的资料。这里放入中断后需要做的操作。REN:是串行接收允许位。中 中断后可取出其中内容。T1 计数器/定时器。

梦境虽美,却不长. 2048

AHP层次分析法在项目风险评估中的实战应用(含Excel模板)

本文详细介绍了AHP层次分析法在项目风险评估中的实战应用。通过构建风险层次模型、利用判断矩阵量化主观判断,并结合Excel工具进行权重计算与一致性检验,将模糊的定性风险转化为清晰的量化排序。文章以新产品上线项目为例,提供了完整的分析流程和可操作的Excel模板,帮助项目经理高效识别并优先处理核心风险。

weixin_29061465的博客 570

告别玄学:用Multisim或LTspice仿真带你直观理解PFC的三种工作模式(CCM/DCM/CrM)

本文通过Multisim和LTspice仿真工具,详细解析了PFC(功率因数校正)的三种工作模式(CCM、DCM、CrM)的本质差异。从波形捕捉到参数优化,提供了实用的仿真技巧和工程实践策略,帮助工程师直观理解并优化PFC电路设计,提升THD和功率因数。

weixin_30363285的博客 396

单片机UART串口通信(代码亲自调试成功)

单片机UART串口通信 单片机的串口通信,一般指的就是UART串口通信(TXD,RXD)。本文实现的是单片机和电脑之间的串口通信,需要用到51单片机开发板,电脑,STC-ISP软件,代码已调试成功,切实可用。 文章目录单片机UART串口通信1.实现代码2.实机操作①连接单片机和电脑②用STC-ISP软件烧录.HEX程序③设置好STC-ISP的串口助手进行发送和接收数据3.UART串口通信详细介绍 1.实现代码 代码如下(示例): #include <reg52.h> #include &lt

qq_44418204的博客 1万+

三极管简单振荡电路实现:从零开始的实战示例

通过一个基础实例,手把手教你如何利用三极管构建简单的振荡电路,深入理解三极管在实际电路中的工作原理与应用技巧。

weixin_32836713的博客 1202

计算机接收串行数据后存储,51串口如何把接收数据存到数组,再把数组的数据发到电脑?...

#include //包含51单片机寄存器定义的头文件#define uchar unsignedchar#define uint unsigned intuchar k=0; //以k做为判断是否接收到数据的依据uchar c; //记录接收到多少个字节的数据uchar receive[12]={0xff,0xff,0xff,0xf...

weixin_34653299的博客 3183

【雕爷学编程】Arduino动手做(45)---红外光电避障传感器模块4

雕爷学编程,Arduino动手做,开源硬件,创客传感器,红外光电避障传感器模块

雕爷学编程 2503

在线考试题库抓取:Python 爬虫抓取各类在线考试平台题库和试题

通过这些技术,您可以抓取各类在线考试平台上的题库数据,进行数据分析、生成练习题集,甚至用于考试准备。为了演示抓取过程,本篇博客选择了两个常见的在线考试平台进行数据抓取:一个是教育考试平台(如“中小学题库”),另一个是职业考试平台(如“华图教育”)。对于这些网站,我们需要找到包含题库信息的页面,并分析每一页的 HTML 结构,从而定位到题目、选项、答案等数据。大多数在线考试平台的题库是分页显示的,因此我们需要遍历多个页面,抓取所有的题库数据。因此,我们需要设置合适的请求头来模拟真实的浏览器请求。

2201_76125261的博客 3438

单片机双机通信c语言实验心得,单片机双机通信实验报告

单片机双机通信实验报告 洛 阳 理 工 学 院 实 验 报 告系 别 计 算 机 系 班 级 B140504 学 号 B14050414 姓 名 史 锦 峰课 程 名 称 单 片 机 原 理 及 组 成 实 验 日 期 2016.04.28实 验 名 称 双 机 通 信 及 PCB 设 计 过 程 成 绩实 验 目 的 : 掌 握 串 行 口 通 信 工 作 原 理 , 熟 悉 单 片 机 电 路...

weixin_42099936的博客 691

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C51单片机通过ESP8266 WiFi模块与电脑无线通信实战指南

在物联网和嵌入式开发领域,无线数据传输是实现设备远程监控与数据采集的关键环节。单片机作为各类智能硬件的核心控制器,通常需要借助无线模块完成与上位机的信息交互。ESP8266作为高性价比的WiFi解决方案,内置完整网络协议栈,通过AT指令即可让传统51系列单片机轻松接入局域网或互联网。基于TCP协议的透传模式,更将复杂的网络通信简化为串口数据收发,配合自定义帧格式与CRC校验,可有效保证传输可靠性。此类技术广泛适用于环境监测、智能家居、工业数据采集等场景。本文以C51单片机配合ESP8266为例,完整阐述从硬

weixin_28292761的博客 279

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

51单片机——串口通信

文章目录 前言 一、串口通信是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(...

weixin_67025806的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

51单片机之串口通信详解及代码示例

目录一、串口介绍二、硬件电路三、51单片机的UART四、相关寄存器4.1 SCON:串口控制寄存器(可位寻址)4.2 PCON:电源控制寄存器(不可位寻址)4.3 TMOD五、串口通信操作流程5.1 发送数据流程5.2 接收数据流程六、波特率计算七、效果演示 一、串口介绍 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。

Wendy的博客 9万+

51单片机---串行口通信(小白可入)

本节讲述了通信的基本概念,对单片机的串口(UART)功能做了介绍,电路图、内部结构,相关寄存器的使用,初始化,利用串口进行单片机与电脑的数据传递。并且完成两个实验。1、串口向电脑发送数据;2、电脑通过串口控制单片机的LED灯。

m0_56399733的博客 2万+
上一篇: 《长安十二时辰》,作为程序员,看完我震惊了!
下一篇: 我所经历的二十年技术演变,一路狂奔到今天
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值