如何查看访问的默认值是什么?

时间:2014-12-04 21:00:48

标签: rascal

假设我有:

visit(p) { 
   case ...
   default:
       println("This should not happen. All elements should be catched. Check: <x>");
};

如何打印出(在本例中为x)无法匹配的内容?

我试过了:

x:default:

\x:default:

default:x:

\default:x:

TX,

2 个答案:

答案 0 :(得分:0)

我们有一个名为Traversal的库,可让您返回匹配的上下文。所以,你可以这样做:

import Traversal;
import IO;

void doit() {
    m = (1:"one",2:"two",3:"three");
    bottom-up visit(m) {
        case int n : println("<n> is an int");
        default: {
            tc = getTraversalContext();
            println("Context is: <tc>");
            println("<tc[0]> is not an int");
            if (str s := tc[0]) {
                println("<s> is a string");
            }
        }
    }
}

tc然后是返回到术语顶部的所有节点的列表 - 在这种情况下,它将只是当前值,如"three",以及地图的整个值m(或整个地图,也是默认情况下的匹配)。如果您有一些结构化的树,例如使用ADT或节点形成的术语,您将从匹配点返回到顶部(这将是整个术语)的所有干预结构。

但出于某种原因,default多次匹配同一个词。我已经在GitHub上将此文件作为错误报告https://github.com/cwi-swat/rascal/issues/731提交。

答案 1 :(得分:0)

你也可以试试这个成语:

visit(x) {
  case ...
  case ...
  case value x: throw "default case should not happen <x>";
}

值模式将捕获所有内容,但只有在尝试其他内容之后才会捕获。