返回

伯克利CS61A Scheme Project:附加题详解

闲谈

大家好,日拱一卒,我是梁唐。本文始发于公众号Code梁。我们继续来肝伯克利CS61A的scheme project,今天我们来聊最后一个部分,附加题部分。

虽然附加题只有两道题,但是要想把这两道题说清,还是需要花费一些笔墨的。

我们先来看第一题:

Implement a Python function

题目要求我们实现一个Python函数,这个函数的功能是将一个Lisp表达式转换为一个Python表达式。

我们知道,Lisp表达式与Python表达式有很多相似之处,例如,两者都可以使用中缀表示法和后缀表示法。但是,两者之间也有很多不同之处,例如,Lisp表达式使用括号来分组,而Python表达式使用逗号来分组。

为了将一个Lisp表达式转换为一个Python表达式,我们需要对Lisp表达式进行解析。解析的过程可以分为以下几个步骤:

  1. 首先,我们需要将Lisp表达式中的括号去除。
  2. 然后,我们需要将Lisp表达式中的符号转换为Python符号。
  3. 最后,我们需要将Lisp表达式中的表达式转换为Python表达式。

下面是一个实现该函数的示例代码:

def lisp_to_python(lisp_expr):
  # 去除括号
  lisp_expr = lisp_expr.replace("(", "").replace(")", "")

  # 将符号转换为Python符号
  lisp_expr = lisp_expr.replace("+", "+").replace("-", "-").replace("*", "*").replace("/", "/")

  # 将表达式转换为Python表达式
  lisp_expr = lisp_expr.replace("(", "[").replace(")", "]")

  return lisp_expr

我们再来看看第二题:

Extend your Python interpreter to support an eval function

题目要求我们扩展我们的Python解释器,使其支持一个eval函数。

eval函数的功能是将一个字符串转换为一个Python表达式,并执行该表达式。

为了扩展我们的Python解释器,使其支持eval函数,我们需要做以下几件事:

  1. 首先,我们需要定义一个eval函数。
  2. 然后,我们需要将eval函数添加到我们的Python解释器中。
  3. 最后,我们需要测试eval函数是否能够正常工作。

下面是一个实现该函数的示例代码:

def eval(expr):
  return eval(expr, globals(), locals())

# 将eval函数添加到我们的Python解释器中
import __builtin__
__builtin__.eval = eval

# 测试eval函数是否能够正常工作
print(eval("1 + 2"))
# 输出结果为:3

以上就是伯克利CS61A Scheme project附加题的全部内容。