用python写的scheme解释器(little schemer读书笔记)

八皇后问题之python和scheme实现 今天看python的书籍,看到递归时又遇到递归中的一个老问题—八皇后问题, 阅读详情

1.内容概览


前四章:介绍了基本的数据结构,atom,list,s-expression;基本的函数原语,primitive。
第五章<Oh My Gawd*:It's Full of Starts>:讲的是如何在nested list中对所有的atom进行操作。即所谓的高阶函数。
第六章:四则运算及其他一些基本运算。四则运算的本质都可以用递归加上add1,sub1来实现。
第七章:集合及其相关操作。

---------------------------------------------------------------------------
以上部分的内容都是比较简单和繁琐。接下来的才是精华。
第八章:collector funciton(即continuation)。Continuation Passing Style。

continuation是一种函数调用机制。我们熟悉的函数调用方法一般是采用栈帧(Stack Frame)来记录从顶层函数到当前函数的所以context。
而continuation不采用堆栈来保存上下文。网上关于continuation中介绍不少,说它不同于栈的先进后出的线性管理contexts的方式,而是采用图和树来管理context。这样的好处就是可以从图中任意一个context节点跳到另一个context节点?这个我没有深入研究了。
little schemer这本书中只提到continuation在递归中的作用。在原函数递归层次间传递一个collector函数,而根据本次原函数的执行结果,通过复杂化collector函数的参数从而实现保存了本次函数执行的context。


第九章:partial function(,which may recurse enternally)。所以我们找一个funcion(will-end),来判断任意function是否为partial function。但will-end是违背哥德尔不完全定理的。这个就是计算逻辑中著名的停机测试悖论(类似的有停机问题,理发师悖论)。

接下来,书中讲到了Y-combinator及其证明。Y-combinator用于构建递归。

第十章:
Schemer的解释器(Interpretor)。可以解释(func(必须是用lambda直接表示的func,而不能只是一个funcname),realarg1,realarg2....)之类的表达式。Intrepretor会最终将源码翻译成(primitive_func realarg1,realarg2,...)。而primitive_func是内置的,从而得到结果。从而最终得到程序结果。

 

2.递归的实现


由于lambda函数都是没名字的,无法自己内部调用自己。我们需要Y-combinator来实现递归,让我们以power(n)函数为例:


1)lambda n. If_Else n==0 1 n*<self>(n-1)
2)let F = lambda n. IF_Else n==0 1 n*F(n-1)看上去不错,是吗?可惜还是不行。因为let F只是起到一个语法糖的作用,在它所代表的lambda表达式还没有完全定义出来之前你是不可以使用F这个名字的.
3)把<self>参数化,构造伪递归函数:let P=lambda self n. If_Else n==0 1 n*self(n-1)
P(P,n)=n*P(n-1)。而P(n-1)错误。有两种4),5)补救方法。

4)<self>应该有两个参数:
let P = lambda self n. If_Else n==0 1 n*self(self, n-1)

5)想法去掉self(self,n)中的self
还是让let P = lambda self n. If_Else n==0 1 n*self( n-1)
干脆我们假设出一个“真正”的递归阶乘函数:power(n)。而只要我们把这个真正的阶乘函数传给P就可算出真的阶乘
P(power,n)=power(n)
=>P(power,)=power(,) power是P的不动点。而不动点是唯一的??


6)如何通过P找到power?
let power_gen = lambda self. P(self(self))
P(power_gen(power_gen))=power_gen(power_gen) !


7)Y combinator
let Y = lambda F.
let f_gen = lambda self. F(self(self))
return f_gen(f_gen)

所以只要提供类似P的伪递归函数F,我们就能通过Y combinator得到我们所需的真正的递归函数。


 

<
Python-PySchemes:简化Python数据结构验证的库 本文还有配套的精品资源,点击获取 简介:Python-PySchemes库提供了一种简洁Pythonic的方式,用于验证Python数据结构的正确性,尤其适用于数据验证和接口规范。它支持多种数据类型,包括基本类型、复合类型和自定义类型,并能处理嵌套数据结构。PySchemes还能提供详细的错误信息以帮助定位问题,并允许开发者自定义验证规则以增强灵活性。此外,它可与Flask... 阅读详情

相关推荐

the little scheme (示例代码,windows运行环境, pdf文件 和 [The Seasoned Schemer pdf])

文件包含: [the little scheme.pdf] 书上的例子源码, windows运行环境(执行scheme程序), 和其姊妹篇 [The Seasoned Schemer.pdf] 文件

minicC语言的解释器源代码

该C语言解释器本身采用标准C语言实现,可以在各种C平台下编译执行。主要特色如下: 1. 完美支持各种标准C语言语法,如if-else结构语句, ?:结构求值语句,for循环,while循环,do...while循环等。 2. 支持各种数据类型包括: char,short,int,string,float。 3. 支持多维数组及指针。 4. 支持自定义函数以及系统函数。 5. 支持局部变量以及全局变量,允许在变量定义时直接初始化。 6. 支持局部变量层次化作用域 7. 允许定义系统常量 8 支持系统内部定义数据类型,但不支持用户在脚本中自定义数据类型. 9 支持行注释符//及段注释符/*...*/ 10. 支持通过include加载其它源文件。 11. 支持各种条件运算符 || && 12. 支持各种逻辑运算及位操作符: + - * / % ! ~ ^ > < <>,并按照C语言标准来规范运算优先级。 13. 支持单目运算!(not)及~(位取反)的嵌套。 14. 支持 += -= *= /= %= &= |= >>= <<= 的赋值形式。 15. 支持++

scheme语言的解释器scheme48

scheme语言的解释器scheme48

计算机程序构造与解释 python中文版 mobi

计算机语言构造与解释 python语言中文版 mobi格式;结合python读起来比原来的lisp描述更容易实际操作

Python实现的Scheme方言SchemePy.zip

Python实现的Scheme方言,支持宏、continuation、lambda、各种基本类型等等,可以直接Python解释执行,也可以编译到JavaScript。编译到JS可以与JavaScript动态交互(互相调用),支持浏览器和nodejs环境。lex和yacc使用的是python的ply库,需要pip install ply。只对python2.7支持,更低版本很可能也可以运行,Python3目前不支持。DEMO(test1.ss)和核心库(core.ss)中有宏定义和调用、函数定义和调用、闭包、列表操作、map操作、fibnacci数列、一个简单的HTTP Server(调用nodejs的http模块实现)core.ss中的defmacro的定义有点问题,使用不方便,但可以使用内置的core-macro重新定义,core.ss中的defmacro、defn等等都也是我自己定义的。其实这个项目只不过是之前项目http://www.oschina.net/p/schemescript的重新实现。所以保留了支持在浏览器中运行(翻译到JavaScript且不使用nodejs库的情况下)这也是对Scheme和编译原理的告别,到今天了也是编译原理图书馆借来后就一直没看最后还是还回学校了。不在停留在这里了。继续前进! 标签:SchemePy

金融波动预测:GARCH模型实战解析与ARIMA对比

本文深入解析GARCH模型在金融波动预测中的实战应用,并与传统ARIMA模型进行对比。通过沪深300指数日收益率数据的案例分析,展示GARCH模型如何有效捕捉波动聚集效应,提升极端波动预测准确率。文章包含Python代码实现、参数解读及模型选择指南,为量化交易者提供实用的波动率建模解决方案。

weixin_29098367的博客 189

从零开始:Ubuntu 24.04 LTS + Win11双系统安装教程

本文将简单直白介绍如何从零开始在同一台电脑上安装 Ubuntu 24.04 LTS 和 Windows 11,你可以在需要进行专业开发或运维工作时,轻松切换到 Ubuntu,享受其带来的高效与自由;而在日常学习生活和娱乐休闲时,依然可以无缝使用熟悉的 Windows 环境。

萑澈的博客 8117

【自动驾驶端到端5:VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning】

从大规模人类驾驶演示中学习类人驾驶策略是有希望的。但是,规划的不确定性使得从驾驶演示中提取驾驶知识是有挑战性的。从统计学习的角度来看,动作(包括实际和速度)是高度随机的,受许多无法建模的潜在因素影响。

weixin_40000560的博客 1405

Visio中高效绘制空间坐标系的实用技巧

本文详细介绍了在Visio中从零开始高效绘制精准空间坐标系的实用技巧。文章摒弃了现成形状的局限,重点讲解了如何利用直线、箭头和文本框等基础工具,结合网格设置、绘图比例调整和图层管理,构建完全可控的三维坐标系。通过分步指南,帮助用户掌握刻度添加、标注对齐及模板创建等高级方法,从而在科研绘图与工程制图中实现专业级的视觉效果。

e3f4g5的博客 558

常见机械臂模型不用找!Mujoco这儿都有!

高质量的模型集合,franka panda,so-arm100,ur之类的机械臂都有。常见机械臂模型不用找!Mujoco这儿都有!大概346M,网速不行的可以下载zip。

darcsdn 992

Qwen2.5-Omni实战:5分钟搞定多模态AI模型本地部署(含Thinker-Talker架构解析)

本文详细介绍了Qwen2.5-Omni多模态AI模型的本地部署流程,包括硬件配置、环境准备和实战应用开发。特别解析了其创新的Thinker-Talker架构,该架构通过TMRoPE位置编码实现跨模态同步处理,大幅提升多模态任务效率。5分钟即可完成部署,适合开发者快速实现文本、图像和音频的联合处理。

weixin_29085865的博客 172

S32K3实战:手把手教你用eMIOS模块实现电机PWM控制(附代码)

本文详细解析了NXP S32K3系列MCU的eMIOS模块在电机PWM控制中的应用,从硬件设计到软件实现,再到调试与优化,提供了完整的实战指南。通过eMIOS模块的硬件级PWM生成能力,工程师可以实现高精度的电机控制,适用于汽车电子和工业控制领域。

weixin_42570484的博客 148

IEC61850客户端连接实战:CMS vs MMS协议抓包对比与性能初探(基于YX-PIS协议栈)

本文深入探讨了IEC61850客户端连接中CMS与MMS协议的抓包对比与性能优化。通过Wireshark抓包分析、协议栈配置实战和性能基准测试,揭示了两种协议在连接建立、数据交互和性能调优方面的关键差异,为智能电网自动化系统的协议选择提供了实用指南。

weixin_29209805的博客 216

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: java classpath path及其常见错误
下一篇: 八皇后问题递归和非递归算法
L_hunter
博客等级 码龄17年 44粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值