给定一个类似 Lisp 语句的表达式 expression
,求出其计算结果。
表达式语法如下所示:
(let v1 e1 v2 e2 ... vn en expr)
, 其中 let
语法总是以字符串 "let"
来表示,接下来会跟随一个或多个交替变量或表达式,也就是说,第一个变量 v1
被分配为表达式 e1
的值,第二个变量 v2
被分配为表达式 e2
的值,以此类推;最终 let 语法的值为 expr
表达式的值。(add e1 e2)
,其中 add
语法总是以字符串 "add"
来表示,该语法总是有两个表达式e1
、e2
, 该语法的最终结果是 e1
表达式的值与 e2
表达式的值之和。(mult e1 e2)
,其中 mult
语法总是以字符串"mult"
表示, 该语法总是有两个表达式 e1
、e2
,该语法的最终结果是 e1
表达式的值与 e2
表达式的值之积。
示例:
输入: (add 1 2) 输出: 3 输入: (mult 3 (add 2 3)) 输出: 15 输入: (let x 2 (mult x 5)) 输出: 10 输入: (let x 2 (mult x (let x 3 y 4 (add x y)))) 输出: 14 解释: 表达式 (add x y), 在获取 x 值时, 我们应当由最内层依次向外计算, 首先遇到了 x=3, 所以此处的 x 值是 3. 输入: (let x 3 x 2 x) 输出: 2 解释: let 语句中的赋值运算按顺序处理即可 输入: (let x 1 y 2 x (add x y) (add x y)) 输出: 5 解释: 第一个 (add x y) 计算结果是 3,并且将此值赋给了 x 。 第二个 (add x y) 计算结果就是 3+2 = 5 。 输入: (let x 2 (add (let x 3 (let x 4 x)) x)) 输出: 6 解释: (let x 4 x) 中的 x 的作用域仅在()之内。所以最终做加法操作时,x 的值是 2 。 输入: (let a1 3 b2 (add a1 1) b2) 输出: 4 解释: 变量命名时可以在第一个小写字母后跟随数字.
注意:
expression
表达式都是格式化后的:表达式前后没有多余的空格,表达式的不同部分(关键字、变量、表达式)之间仅使用一个空格分割,并且在相邻括号之间也没有空格。我们给定的表达式均为合法的且最终结果为整数。