我正在尝试编写一个进行类型转换的函数,这似乎是Rascal代码中经常发生的活动。但是我似乎无法正确地做到这一点。以下及其几种变体失败。
public &T cast(type[&T] tp, value v) throws str {
if (tp tv := v)
return tv;
else
throw "cast failed";
}
有人可以帮我吗?
更多信息:我经常对“ Type Var”形式的模式(即针对变量声明)使用模式匹配,以告知Rascal表达式具有某种类型,例如
map[str,value] m := myexp
通常,这是在我知道myexp具有map [str,value]类型的情况下,但是省略匹配将使Rascal的类型检查机制抱怨。为了更防错,我通常将匹配的结构包装在if-then-else中,如果匹配失败,则会引发异常:
if (map[str,value] m := myexp) {
// use m
} else {
throw "cast failed";
}
我想使用一个一般执行此功能的函数来缩短所有这些类似的代码段,以便我可以编写
cast(#map[str,value], myexp)
PS。另请参阅如何在Rascal中将值类型转换为Map?
该代码有一个错误。这是固定的代码:
public &T cast(type[&T] tp, value v) throws str {
if (&T tv := v)
return tv;
else
throw "cast failed";
}
请注意,我们不希望将此内容包含在标准库中。而是让我们收集需要的案例,并找出如何以其他方式修复它。
如果发现您经常需要这种转换,那么您可能会避免使用Rascal的更好部分,例如基于模式的调度。另请参阅马克·希尔斯(Mark Hills)的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句