首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何用Python编写一个Lisp解释器

有许多用于词法分析的工具(如 Mike Lesk 和 Eric Schmidt 的 lex),但现在我们选择使用一个非常简单的工具:Python 的 str.split 函数。...Lisp一个伟大之处就在于交互式 read-eval-print 循环:为编程者提供了输入表达式,并立即读取,计算,然后输出的途径,而非冗长的构建/编译/运行过程。...那么,我们来定义一下 repl 函数函数 schemestr 返回了一个代表 Schema 对象的字符串: def repl(prompt='lis.py> '): "A prompt-read-eval-print...在我看来,它可以达到我的目的,即充当 Lisp 的解释器。 真实的故事 追溯这个想法的来源有助于理解解释器的工作原理,下面给大家分享一个真实的故事。...而研究生伙伴 Tony DeRose 也有同样的需求,于是他们一起勾勒出了一个简单的 Lisp 程序,可用作预处理器。

1.3K40

解释器模式举例-TypeScript 类型体操天花板,用类型运算写一个 Lisp 解释器

把 类型当成一门纯函数式编程语言其实不算准确,比如 类型就缺少一个标志性的能力「First-Class-」,在表现上就是没有高阶函数,但是这并不影响他的表达能力。...具体的不展开讲了,可以看一下面这个回答,如果我们把一个环境(闭包)当成参数传递给函数解释器模式举例,那意味着并不需要高阶函数一样能实现闭包的效果。   ...这里要提出一个「反常识」的概念了:   递归和循环等价!所以在纯函数式编程语言里面往往用递归代替循环。   ...无非就是一个一段代码不断执行罢了,同上面的高阶函数小结我们给循环一个定义:   \begin{} () \ & ' \ Test() \ & True | False\ Loop(Test,, )...unknown : _DivideBy;   词法分析   词法分析过程也比较简单,我挑选 Lisp 的语法进行实现,就是因为 Lisp S 表达式非常容易解析,解析的过程非常简单,核心代码如下,整体逻辑就是一种类型一种类型的

42130
您找到你想要的搜索结果了吗?
是的
没有找到

这是一个函数[](){}

[](){}是一个C++11下的Lambda表达式(匿名函数),当然[]{}也是一个Lambda表达式。 1....Lambda表达式区别 Lambda表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样具有返回值。Lambda表达式本质上与函数声明非常类似。...lambda可以转换为std::function函数,但是它又与类型有所区别。使用typeid获取类型名字即使是相同的表达式,它们的名字也会不一样。...(1) Capture子句,在 C++ 规范中也称为 lambda 引导; []不捕获任何变量; [&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获); [=]捕获外部作用域中所有变量...,并作为副本在函数体中使用(按值捕获)。

96931

一个函数的自白

且听一个函数的自白,从函数的角度看编程的方式。 我眼中的大环境——内存 空山不见人 但闻人语响 代码最终都要加载到内存中执行,组成函数的代码同样如此。...尾调用是指一个函数里的最后一个动作是一个函数调用,即在函数尾部发生的递归调用。...下一个是我的自动调用——回调和匿名 忽如一夜春风来,千树万树梨花开。 一般地,函数间的调用是显式的,即一个函数执行完毕在执行下一个函数。...但有这样一种使用场景,一个函数一个额外的参数,通常是最后一个,这一参数是另一个函数,在函数执行到末尾的时候,作为参数的函数也会被调用。...在C/C++中,回调函数就是一个通过函数指针调用的函数,把函数的指针(地址)作为参数传递给另一个函数,用这个指针来调用其所指向的函数。回调函数一般使用通知机制。

74450

探索命名之美(一)

痛定思过,我决定要研究应该怎么命名,为什么要给函数一个好的命名很难,应该怎么样给函数命名。...Xah Lee[3]指出,好的命名应该可以让领域外的人一目了然,批评了Lisp语言的命名,如cdr,car,cons,认为这些命名让不懂Lisp的人看得不知所云,也批评了pop、push、shift这些命名...二、 人类世界语言VS程序语言 这种困难,归根结底是人类世界的语言和程序语言存在差异,主要在以下三个方面: 人类语言 程序语言 定义不清晰,逐渐细化 完全、清晰、明确的定义 含义不唯一,需要上下文 有名函数具有严格...、唯一的含义及使用场景 更容易来造词 只能在已有语言基础上来拼接 人类语言中,词的产生大多是由个人慢慢扩散至群体,并在过程中不断细化其含义。...这些词一开始只在一个人或者一小群人里流行,慢慢的口口相传,在传播的过程中不断的细化,最终成为通用、流行的词汇,比如晒工资、房奴等词。人类世界语言的词的含义允许用时间来修正。

50930

OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)

OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化) ---- 目录 OpenCV这么简单为啥不学——1.1、图像处理(灰度图...、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化) 前言 环境 灰度图 模糊图片 GaussianBlur函数 提取边缘 边缘膨胀 边缘细化 整体对照 总结 ---- 前言 计算机视觉市场巨大而且持续增长...import cv2 import numpy as np # 获取图片的数组 img = cv2.imread("800_600.jpg") # 卷积核:一般用一个5行5列的全是1的数组 kernel....COLOR_BGR2GRAY) # 展示 cv2.imshow("Gray Image", imgGray) cv2.waitKey(0) 实际效果:灰度 模糊图片 代码:可以修改模糊的强度,是一个奇数...imshow("imgEroded", imgEroded) cv2.waitKey(0) 实际效果:  整体对照 总结 很多参数细节都是需要我们自己来根据实际需求来调整的,包括后期的AI循环也是一个参数一个参数的调整出来的结果

62930

如何设计一个缓存函数

,我要在页面中插入1000条数据 分时函数 在这之前我们使用过一个分时函数思想来优化加载数据 现在我们把这个分时函数写成一个工具函数 // utils/timerChunks.js // 分时函数 module.exports...缓存函数其实就是当我们第二次加载的时,我们会从缓存对象中获取函数,这是一个常用的优化手段,在webpack源码中也有大量的这样的缓存函数处理 首先我们创建一个memorize工具函数 // utils.../utils/timerChunk.js')); 实际上你也可以不需要这么做,因为timerChunk.js本身就是一个函数,memorize只要保证传入的形参是一个函数就行 所以以下也是等价的,你也可以像下面这样使用...为此这样的一个memorize的函数就可以当成业务代码的一个通用的工具来使用了 深拷贝对象 我们再来看另外一个例子,深拷贝对象,这是一个业务代码经常有用的一个函数,我们可以用memorize来优化,在webpack...总结 使用memorize缓存函数优化代码,本质缓存函数就是巧用闭包特性,当我们首次加载回调函数时,我们会缓存其回调函数并会设置一个开关记录已经缓存,当再次使用时,我们会直接从缓存中获取函数

40120

一个有味道的函数

一个有味道的函数 最近想到了一个自认为很有意思的面试题 如何实现一个compose函数函数接收数个参数,参数均为Function类型,右侧函数的执行结果将作为左侧函数执行的参数来调用。...1.0实现方案 大致的思路为: 获取所有的参数 调用最后一个函数,并接收返回值 如果没有后续的函数,返回数据,如果有,将返回值放入下一个函数中执行 所以这种情况用递归来实现会比较清晰一些 function...,获取返回值 // 如果后续还有函数,将返回值放入下一个函数执行 // 如果后续没有了,直接返回 return funcs.length ?...(func(arg, arg => exec(arg))) 也就是说,我们会提前执行下一个函数,而且下一个函数的then事件注册是在我们当前函数内部的,当我们拿到返回值后,就可以进行后续的处理了。...而我们所有的函数是存放在一个队列里的,在我们提前执行完毕该函数后,后续的执行也就不会再出现了。避免了一个函数被重复执行的问题。

50830

一个有味道的函数

一个有味道的函数 最近想到了一个自认为很有意思的面试题 如何实现一个compose函数。...1.0实现方案 大致的思路为: 获取所有的参数 调用最后一个函数,并接收返回值 如果没有后续的函数,返回数据,如果有,将返回值放入下一个函数中执行 所以这种情况用递归来实现会比较清晰一些 function...,获取返回值 // 如果后续还有函数,将返回值放入下一个函数执行 // 如果后续没有了,直接返回 return funcs.length ?...(func(arg, arg => exec(arg))) 也就是说,我们会提前执行下一个函数,而且下一个函数的then事件注册是在我们当前函数内部的,当我们拿到返回值后,就可以进行后续的处理了。...而我们所有的函数是存放在一个队列里的,在我们提前执行完毕该函数后,后续的执行也就不会再出现了。避免了一个函数被重复执行的问题。

609120

einsum,一个函数走天下

现在,这些问题你统统可以一个函数搞定,没错,就是 einsum,einsum 函数就是根据上面的标记法实现的一种函数,可以根据给定的表达式进行运算,可以替代但不限于以下函数: 矩阵求迹:trace 求矩阵对角线...,都可以用一个 einsum 解决,下面以 numpy 举几个栗子: 上面的以 sum 函数的实现代码,设 ?...然后是测试代码: 上面 Timer 是 timeit 模块内的一个类 将两个函数各执行 20 遍,最后的结果为,单位为秒: 可以看到,einsum 比 sum 快了几乎一个量级,接下来测试单个张量求和...最后,再测试 einsum 与另一个常用的函数 tensordot,首先定义两个四维张量的及 tensordot 函数: 该实现对应的公式为: ?...;不过说是一个函数打天下,肯定是做不到的,还有一些数组的分割、合并、指数、对数等功能没法实现,需要使用别的函数,其他的基本都可以用 einsum 来实现,简单而又高效。

1.8K20

一个函数一个案例,手把手带你学习Pandas统计汇总函数

前几天看到一篇文章,给大家列出了Pandas的常用100函数,并将这100个函数分成了6类:统计汇总函数、数据清洗函数、数据筛选、绘图与元素级运算函数、时间序列函数和其他函数。...因此,今天这个文章,我将会带大家用 "案例教学" 的方式,学会这100个Pandas函数。 ? 限于篇幅,为了方便大家学习,我这里先分类教学。今天为大家讲述统计汇总函数中的26个函数。 ?...注明: 由于实际问题中,表格数据每一行代表一个样本,每一列代表一个字段,一般情况下对行操作的意义不大,主要是对每个不同列进行操作。因此,下面我们仅讲述对列的操作。...注意:这两个函数,用于函数删选,很有用。 14. any、all any():返回是否所有元素都为真;all():返回是否至少一个元素为真; ? 上述代码的意思:判断班级各科成绩是否都在60分以上。...17. pct_change pct_change():运算比率(后一个元素与前一个元素的比率); ? 运算规律是:(后一个值 - 前一个值) / 前一个值;

1K30

java构造函数调用另一个构造函数_java中的构造函数

参考链接: Java程序从另一个调用一个构造函数 package demo03; /*  * 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法  * 格式:...方法体  *   * }  * 注意事项:  * 1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样  * 2.构造方法不要写返回值类型,连void都不写  * 3.构造方法不能return一个具体的返回值... * 4.如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数,方法体什么都不做  * 5.一旦编写了至少一个构造方法,那么编译器将不再赠送  * 6.构造方法也是可以进行重载的。

4.4K60

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢?...根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。...一个函数引发了血案!!!血案,血案。。。 到现在你是不是还不明白那个“鬼函数”,到底为什么速度那么快吗?...编译,实验,这个函数不仅工作的很好,而且比标准的sqrt()函数快4倍!要知道,编译器自带的函数,可是经过严格仔细的汇编优化的啊!...最后Lomont怒了,采用暴力方法一个数字一个数字试过来,终于找到一个比卡马克数字要好上那么一丁点的数字,虽然实际上这两个数字所产生的结果非常近似,这个暴力得出的数字是0x5f375a86。

1.1K50

Python定义一个函数的方法

Python函数的定义 定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具。...此格式中,各部分参数的含义如下: 函数名:从语法角度来看,函数名只要是一个合法的标识符即可;从程序的可读性角度来看,函数名应该由一个或多个有意义的单词连缀而成,每个单词的字母全部小写,单词与单词之间使用下画线分隔...另外,如果想定义一个没有任何功能的空函数,可以使用 pass 语句作为占位符。...z # 定义一个函数,声明一个形参 def say_hi(name) : print("===正在执行say_hi()函数===") return name + ",您好!"...,更多相关Python如何定义一个函数内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

1.2K20
领券