Tridash 是一种新兴的编程语言,其0.5版本带来了一系列重要的改进和新特性。本文将对这些新特性进行概述。
0.5版本对Tridash语言的语义进行了显著的细化。
之前的版本没有正式的求值策略。通常情况下,所有节点都严格求值,即它们的值总是被计算,对于if、and、or表达式有一些特殊例外。新版本为所有节点制定了非严格求值策略,这意味着只有当节点的值实际被使用时,才会计算它的值,并且已经移除了特殊例外。if、and、or现在只是普通函数(元节点)。
严格性分析阶段决定函数参数的值是否总是被使用,因此可以在将参数传递给函数之前进行求值。这是一个优化步骤,允许按值传递参数,这比稍后计算值的thunk更有效。
新的求值策略还允许任何尾调用位置的函数调用进行适当的尾调用消除。这意味着无论递归深度如何,都使用恒定数量的栈空间。与严格性分析相结合,这确保了作为累加器的参数使用恒定数量的栈空间。
失败值是一类特殊的值,当求值时会触发当前操作的失败。当函数参数求值为失败时,函数的求值将终止,并返回一个新的失败值。失败用于表示值的缺失、操作的失败或特殊类别的值,如空列表。
使用特殊的失败值的想法是,主要的应用逻辑可以专注于实际发生的计算,而不必检查是否发生了错误。相反,错误处理代码可以与主要应用逻辑分开。
每个绑定都建立在节点的特定上下文中。这个版本允许使用@运算符显式指定这个上下文。运算符的左侧是节点,右侧是上下文标识符,可以是任何有效的标识符。
当多个绑定建立到同一个上下文时,只有当所有先前绑定的结果都是失败值时,源代码中后面建立的绑定才会被激活。这是处理失败的手段。
添加了链表数据结构。列表也用于表示接受可变数量参数的函数的参数列表,并且用于表示传递给宏的Tridash表达式。
空列表由具有特殊类型Empty的失败值表示。将空列表表示为失败值简化了某些列表处理函数的实现。
可以将函数标记为宏。结果,函数在编译时被调用,参数是原始表达式而不是计算的参数值。函数的返回值被解释为Tridash表达式,替换宏表达式。标识符由特殊符号类型表示,函数调用表达式由列表表示,函数/操作符在列表的第一个元素中,参数在剩余元素中。这种表示受到Lisp语言中S-表达式表示的启发。
宏可以用来以简单函数无法实现的方式扩展语言。
0.5版本中添加了一种独特的模式匹配形式。通过在->运算符右侧指定模式(函数表达式)的绑定,可以将节点与模式匹配。源节点在->的左侧,然后与模式匹配。模式匹配意味着模式的参数节点绑定到函数返回值等同于源节点的值的值。如果没有这样的值,参数节点求值为失败。
考虑从一个输入x中解析整数。然后使用解析的整数值进行一些计算,为了简单起见,假设给值加1并显示结果。使用int函数从字符串中解析整数值。
int(x) + 1 -> output
如果无法从x中解析出整数值,int函数将返回一个失败值。结果,int(x) + 1的求值也将导致失败值,并且不会显示输出。
要显示错误消息,提示用户输入正确的值,只需要检查output是否求值为失败。fails?函数如果其参数求值为失败,则返回true:
if(fails?(output), "Please enter a valid integer!", "") -> error