【CS61A 2024秋】Python入门课,全过程记录P6(Week12 Interpreters开始,更新于2025/2/7)

devtools/2025/2/8 5:16:26/

文章目录

  • 关于
  • 新的问题
  • 更好的解决方案
  • Week12
    • Mon No Lecture: Veterans
      • Lab 10: Interpreters
        • Q1: Using Pair
        • Q2: New Procedure
        • Q3: New Form

关于

个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。

江湖有缘相见🤝。如果读者想和我交个朋友可以加我好友(见主页or个人博客),共同学习。笔者是学生,课业还是比较繁重的,可能回复不及时。笔者也正在四处寻找一些可以兼职锻炼知识并且补贴一些生活的工作,如果读者需要一些详细的辅导,或者帮助完成一些简易的lab也可以找我,笔者还是学生,自以为才学有限,也没有高价的理由📖。

新的问题

在这里插入图片描述
可以发现,cs61a归档了,而这个网站是需要Berkeley账号的,还是没法登录。这时候笔者决定使用档案馆网站,去翻网页的归档了。虽然有点难受,但是还能用orz。

对了,textbook是可以直接访问的,在这里

更好的解决方案

我在GitHub上找到了cs61a 2024 fall的归档,这里给出连接link

Week12

Mon No Lecture: Veterans

Lab 10: Interpreters

Q1: Using Pair

问答题略。

Q2: New Procedure

这个lab又回到了python,给scheme语言用python写一个解释器。
注意,程序文件下面使用字典OPERATORS把字符串映射成函数了。
前面的eval

def calc_eval(exp):""">>> calc_eval(Pair("define", Pair("a", Pair(1, nil))))'a'>>> calc_eval("a")1>>> calc_eval(Pair("+", Pair(1, Pair(2, nil))))3"""if isinstance(exp, Pair):operator = OPERATORS[exp.first] # UPDATE THIS FOR Q2, e.g (+ 1 2), + is the operatoroperands = exp.rest # UPDATE THIS FOR Q2, e.g (+ 1 2), 1 and 2 are operandsif operator == 'and': # and expressionsreturn eval_and(operands)elif operator == 'define': # define expressionsreturn eval_define(operands)else: # Call expressionsreturn calc_apply(operator, operands) # UPDATE THIS FOR Q2, what is type(operator)?elif exp in OPERATORS:   # Looking up proceduresreturn OPERATORS[exp]elif isinstance(exp, int) or isinstance(exp, bool):   # Numbers and booleansreturn expelif _________________: # CHANGE THIS CONDITION FOR Q4 where are variables stored?return _________________ # UPDATE THIS FOR Q4, how do you access a variable?
def floor_div(args):""">>> floor_div(Pair(100, Pair(10, nil)))10>>> floor_div(Pair(5, Pair(3, nil)))1>>> floor_div(Pair(1, Pair(1, nil)))1>>> floor_div(Pair(5, Pair(2, nil)))2>>> floor_div(Pair(23, Pair(2, Pair(5, nil))))2>>> calc_eval(Pair("//", Pair(4, Pair(2, nil))))2>>> calc_eval(Pair("//", Pair(100, Pair(2, Pair(2, Pair(2, Pair(2, Pair(2, nil))))))))3>>> calc_eval(Pair("//", Pair(100, Pair(Pair("+", Pair(2, Pair(3, nil))), nil))))20""""*** YOUR CODE HERE ***"print("DEBUG:", args, type(args))x = args.firstcur = args.restwhile cur is not nil:x //= calc_eval(cur.first)cur = cur.restreturn x
Q3: New Form

求值,如果有假值就返回False,否则取最后一个值。只有#f是false,其他都是true。

def eval_and(expressions):""">>> calc_eval(Pair("and", Pair(1, nil)))1>>> calc_eval(Pair("and", Pair(False, Pair("1", nil))))False>>> calc_eval(Pair("and", Pair(1, Pair(Pair("//", Pair(5, Pair(2, nil))), nil))))2>>> calc_eval(Pair("and", Pair(Pair('+', Pair(1, Pair(1, nil))), Pair(3, nil))))3>>> calc_eval(Pair("and", Pair(Pair('-', Pair(1, Pair(0, nil))), Pair(Pair('/', Pair(5, Pair(2, nil))), nil))))2.5>>> calc_eval(Pair("and", Pair(0, Pair(1, nil))))1>>> calc_eval(Pair("and", nil))True""""*** YOUR CODE HERE ***"cur = expressionsans = scheme_twhile cur is not nil:val = calc_eval(cur.first)if val == scheme_f and type(val) == type(scheme_f):return scheme_felse:ans = valcur = cur.restreturn ans

注意,在python里面0==False是True哦。还有要修改下面的

OPERATORS = { "//": floor_div, "+": addition, "-": subtraction, "*": multiplication, "/": division, "and": eval_and}

http://www.ppmy.cn/devtools/157015.html

相关文章

IOC三种实现方式的区别

在Spring框架中,IOC(控制反转)通过依赖注入(DI)来实现,而依赖注入主要有三种实现方式:构造器注入、Setter注入和字段注入。每种方式都有其特点、适用场景和优缺点。以下是它们的详细对比&#x…

使用 Axios 获取用户数据并渲染——个人信息设置+头像修改

目录 功能介绍 完整源码 1. HTML 代码 2. JavaScript 代码 (1)获取用户信息并渲染 (2)头像上传 如何使用? 总结 本项目是一个用户个人信息管理页面,用于获取、修改用户信息以及更换头像。本教程详细…

大一计算机的自学总结:数据结构设计相关题

前言 说实在的&#xff0c;感觉这种设计数据结构的题比链表题还要ex&#xff0c;尤其是当哈希表和链表一起上的时候&#xff01; 一、设计有setAll功能的哈希表 #include <bits/stdc.h> using namespace std;int cnt0,setAllTime0,setAllValue; map<int,pair<in…

数据结构-队列

1.队列 1.1什么是队列 只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表称为队列&#xff0c;队列遵循先进先出FIFO&#xff08;First In First Out&#xff09;的原则。 入队列&#xff1a;进行插入操作时的一段称为队尾 出队列&#xff1a…

金蝶云星空k3cloud webapi报“java.lang.Class cannot be cast to java.lang.String”的错误

最近在对接金蝶云星空k3cloud webapi时&#xff0c;报一个莫名其妙的转换异常&#xff0c;具体如下&#xff1a; 同步部门异常! ERP接口登录异常&#xff1a;java.lang.Class cannot be cast to java.lang.String at com.jkwms.k3cloudSyn.service.basics.DeptK3CloudService.…

Vue基础:侦听器(侦听属性)【watch、watchEffect】

文章目录 引言I 侦听器(侦听属性)基本示例侦听数据源类型回调的触发时机自动停止侦听器条件式的侦听逻辑实现同步创建侦听器手动停止异步回调创建的侦听器II 侦听器选项说明一次性侦听器 once即时回调的侦听器 immediate深层侦听器 deep后置刷新 flush: post同步侦听器 flush…

面经-C语言——堆和栈的区别,引用和指针区别,Linux的常用指令,RS232和RS485,TCP连接建立与断开

面经-C语言——堆和栈的区别&#xff0c;引用和指针区别&#xff0c;Linux的常用指令,RS232和RS485,TCP连接建立与断开 堆(Heap)和栈(Stack)的详细比较引用和指针区别对比表&#xff1a;Linux的常用指令RS232和RS485的详细比较&#xff1a;TCP连接建立与断开三次握手&#xff0…

18爬虫:关于playwright相关内容的学习

1.如何在python中安装playwright 打开pycharm&#xff0c;进入终端&#xff0c;输入如下的2个命令行代码即可自动完成playwright的安装 pip install playwright ——》在python中安装playwright第三方模块 playwright install ——》安装playwright所需的工具插件和所支持的…