当前位置: 首页 > article >正文

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

文章目录

  • 关于
  • 新的问题
  • 更好的解决方案
  • 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 operator
        operands = exp.rest # UPDATE THIS FOR Q2, e.g (+ 1 2), 1 and 2 are operands
        if operator == 'and': # and expressions
            return eval_and(operands)
        elif operator == 'define': # define expressions
            return eval_define(operands)
        else: # Call expressions
            return calc_apply(operator, operands) # UPDATE THIS FOR Q2, what is type(operator)?
    elif exp in OPERATORS:   # Looking up procedures
        return OPERATORS[exp]
    elif isinstance(exp, int) or isinstance(exp, bool):   # Numbers and booleans
        return exp
    elif _________________: # 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.first
    cur = args.rest
    while cur is not nil:
        x //= calc_eval(cur.first)
        cur = cur.rest
    return 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 = expressions
    ans = scheme_t
    while cur is not nil:
        val = calc_eval(cur.first)
        if val == scheme_f and type(val) == type(scheme_f):
            return scheme_f
        else:
            ans = val
        cur = cur.rest
    return ans

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

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

http://www.kler.cn/a/536100.html

相关文章:

  • 使用 CSS 实现透明效果
  • python:csv文件批量导入mysql
  • 生产环境超实用shell脚本一
  • 115,【7】 攻防世界 web fileinclude
  • docker安装es及分词器ik
  • WebSocket协议里客户端发送给服务器的数据会用4字节的掩码循环异或的分析
  • 【HarmonyOS NEXT】设备显示白屏 syswarning happended in XXX
  • C++ 类和对象 详细版(上)
  • PT2021K 单触控同步输出 IC
  • Python爬虫-如何正确解决起点中文网的无限debugger
  • CF 278A.Circle Line
  • Python中__init__.py文件的作用
  • GitPuk快速安装配置教程(入门级)
  • c# Lazy<T>单例模式 - 延迟初始化单例实例示例与详解
  • Android GPS功耗优化思考点
  • 【Leetcode 热题 100】136. 只出现一次的数字
  • ControlNet 风格迁移介绍
  • 【R语言】apply函数族
  • mysql优化-升级8.0服务启动失败
  • 250207-MacOS修改Ollama模型下载及运行的路径
  • python编程-内置函数 bytes() , bytearray()详解
  • 微服务架构中的事件驱动设计:使用 Kafka 和 Apache Pulsar 实现高效的事件流管理
  • 【k8s集群应用】kubectl命令行工具管理-陈述式管理
  • 在线免费 HTML 预览工具
  • 星闪开发入门级教程之安装编译器与小项目烧录
  • feign 远程调用详解