Import 流氓:包含导入的符号

Import 流氓:包含导入的符号,import,read-eval-print-loop,rascal,Import,Read Eval Print Loop,Rascal,我在repl中使用多个语法。语法中的一些规则使用相同的名称 文档方法之一,用于消除函数模式匹配中类型注释的歧义(它在load函数的注释中,但不在本页的代码中-在.jar中它是正确的)。但这可能会变得单调乏味,因此可能存在导入的别名(如Python中的import regex as r)?!在parse函数的第一个参数中使用完全限定似乎无助于消除递归调用的所有解析规则的歧义,parse(#lang::java::\syntax::Java18::compileationunit,src)。如果我同

我在repl中使用多个语法。语法中的一些规则使用相同的名称

文档方法之一,用于消除函数模式匹配中类型注释的歧义(它在
load
函数的注释中,但不在本页的代码中-在.jar中它是正确的)。但这可能会变得单调乏味,因此可能存在导入的别名(如Python中的import regex as r)?!在
parse
函数的第一个参数中使用完全限定似乎无助于消除递归调用的所有解析规则的歧义,
parse(#lang::java::\syntax::Java18::compileationunit,src)
。如果我同时导入lang::java::\syntax::Java15,至少会产生奇怪的错误

一般来说,处理来自同名不同模块的符号的安全方法是什么


或者,是否有办法“卸载”repl中的模块?

一些背景信息:

  • Rascal模块因可扩展性而打开,特别是
    数据
    语法
    定义和重载函数可以通过导入另一个模块进行扩展;通过这种方式,您可以通过导入另一个模块并随意添加规则和函数替代项来扩展语言及其处理函数
  • import
    ing和
    extend
    ing模块之间存在语义差异。特别是,
    import
    是不可传递的,并且只融合导入模块中名称的使用,
    extend
    是可传递的,并且还融合了被扩展模块中名称的递归使用。因此,对于扩展语言,您默认使用
    extend
    ,而对于使用函数库,则使用
    import
  • 我们计划在2020年的其中一个版本中完全删除
    导入
    中的
    融合
    行为。在此之后,所有冲突导入的非终端名称必须通过使用模块名称作为前缀来消除歧义,并且前缀将不再具有融合不同模块中递归使用的非终端的副作用。对于
    extend
    ,情况并非如此,它仍然会始终融合非终端和功能
  • REPL实例中的所有定义都模拟单个匿名模块成员的语义
  • 因此,要回答您的问题:

    • 在我们修复
      import
      的语义之前,使用相同的名称处理来自不同导入模块的符号并不特别安全
    • 模块前缀技巧只在“顶层”起作用,下面的类型无论如何都会融合,因为将非终端具体化为语法的代码不会传播前缀。它不知道怎么做
    • 取消模块的导入:

      rascal>import IO;
      ok
      rascal>println("x");
      x
      ok
      rascal>:un
      undeclare   unimport    
      rascal>:unimport IO
      ok
      rascal>println("x");
      |prompt:///|(0,7,<1,0>,<1,7>): Undeclared variable: println
      
      rascal>导入IO;
      好啊
      流氓>印刷体(“x”);
      x
      好啊
      流氓>:联合国
      未申报的不重要
      流氓>:不重要的木卫一
      好啊
      流氓>印刷体(“x”);
      |提示://|(0,7,,):未声明的变量:println
      
      • 可能是环境中使用最少的功能之一;警告买主

    要解决这些问题,一种方法是在不同的模块中为每个单独的语言/语言版本编写函数,并创建一个顶层模块,如果您希望将功能捆绑到单个接口中,则导入这些模块。这样,因为
    import
    是不可传递的,所以名称空间保持独立和干净。当然,这并不能解决REPL问题;我唯一能提供的就是为您正在使用的每个语言版本启动一个新的REPL

    太好了,谢谢你提供更多细节。有没有计划允许导入库使用别名?没有,还没有;但是可以在github上随意推荐:-)它是
    :unimport
    ,所有不是严格模块成员的REPL命令都以冒号开头。像
    :退出
    :编辑
    ,这样的版本0.16.2是从12月份开始的最新稳定版本。这是目前推荐的版本。我的REPL确实知道
    extend
    ,就像这样:
    rascal>extend IO