给你一个类似 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"
,"let"
,"mult"
会被定义为 "关键字" ,不会用作变量名。示例 1:
输入:expression = "(let x 2 (mult x (let x 3 y 4 (add x y))))" 输出:14 解释: 计算表达式 (add x y), 在检查变量 x 值时, 在变量的上下文中由最内层作用域依次向外检查。 首先找到 x = 3, 所以此处的 x 值是 3 。
示例 2:
输入:expression = "(let x 3 x 2 x)" 输出:2 解释:let 语句中的赋值运算按顺序处理即可。
示例 3:
输入:expression = "(let x 1 y 2 x (add x y) (add x y))" 输出:5 解释: 第一个 (add x y) 计算结果是 3,并且将此值赋给了 x 。 第二个 (add x y) 计算结果是 3 + 2 = 5 。
提示:
1 <= expression.length <= 2000
exprssion
中不含前导和尾随空格expressoin
中的不同部分(token)之间用单个空格进行分隔