【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}