我目前正在为自定义编程语言编写编译器。编译器将每一个操作符或调用转换为一个对象形式
Call : Value
{
Value instance
String name
Value[] arguments
}
Run Code Online (Sandbox Code Playgroud)
例如,表达式3 + 4(= 3.+(4)) 变为
Call : Value
{
instance = Value(3)
name = "+"
arguments = [ Value(4) ]
}
Run Code Online (Sandbox Code Playgroud)
该表达式3 + 4 * 5将由解析器评估为3.+(4).*(5)。
Call : Value
{
instance = Call
{
instance = Value(3)
name = "+"
arguments = Value(4)
}
name = "*"
arguments = [ Value(5) ]
}
Run Code Online (Sandbox Code Playgroud)
我知道有一个函数可以在此结构中创建调用列表并按运算符优先级对它们进行排序,结果如下所示:
[ 3.+(4).*(5), 3.+(4) ] (以上表格) …
java compiler-construction algorithm evaluation operator-precedence
我想JFileChooser在我的程序中使用a 来选择目录并进行处理.但是,无论FileFilter我使用什么文件选择器,选择Open目录时按钮都会被锁定.以下是我的代码FileFilter.
this.fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter()
{
@Override
public String getDescription()
{
return "Directories";
}
@Override
public boolean accept(File f)
{
return f.isDirectory();
}
});
Run Code Online (Sandbox Code Playgroud) 将Scala文件反编译为Java代码时,经常会遇到用ScalaSignatures 注释的类。这些似乎只有一个注释值,即经过某种程度编码的String。为什么Scala编译器会创建这样的奇数构造,而不是Attribute在class文件中使用custom ?
我最近听说自Java 8以来可以定义一个this在实例方法中调用的显式参数,如下所示:
public class Test
{
public void test(Test this, int i) { System.out.println(i); }
}
Run Code Online (Sandbox Code Playgroud)
这种语法有什么用?
正如您在此截图(Eclipse,编译器兼容性Java 8)中可以清楚地看到的,这是有效的语法.

在Java中是否有任何情况需要您显式this转换为当前类以外的其他类型?
class SomeClass
{
void foo()
{
SomeOtherClass s = (SomeOtherClass) this;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:所有答案都指的SomeOtherClass是子类的情况SomeClass,但this在适当的OO设计的情况下可以避免铸造.我正在寻找OO无法帮助你的情况,即哪里SomeOtherClass是超级类SomeClass.
我知道iOS 9中有一种新的随机播放方法, 但是我想知道是否仍然可以用相同的方式随机播放两个数组?
例如
[1,2,3,4] and [a,b,c,d]
shuffle
[3,4,1,2] and [c,d,a,b]
Run Code Online (Sandbox Code Playgroud) 看看以下两个表达式:
baz(Foo<Bar, Bar>(0))
baz(Foo < Bar, Bar > (0))
Run Code Online (Sandbox Code Playgroud)
不知道是什么,baz,Foo和Bar是(baz可以是一个类型或方法,Foo并且Bar可以是类型或变量),不存在多义性是否方式<代表了一个类型参数列表或小于操作.
// two different outcomes, difference shown with parentheses
baz((Foo<Bar,Bar>(0))) // generics
baz((Foo < Bar), (Bar > 0)) // less-than
Run Code Online (Sandbox Code Playgroud)
任何理智的编程语言都不应该依赖于什么baz,Foo并且Bar在解析像这样的表达式时.然而,无论我在哪里放置空格,Swift都设法消除下面的表达式的歧义:
println(Dictionary<String, String>(0))
println(Dictionary < String, String > (0))
Run Code Online (Sandbox Code Playgroud)
编译器如何管理它?而且,更重要的是,Swift语言规范中是否有任何地方.其中描述了规则.看Language Reference一下Swift书的一部分,我只发现了这一部分:
在某些构造中,具有前导
<或>可能被分成两个或更多个令牌的运算符.其余部分以相同的方式处理,可能会再次拆分.因此,不需要使用空格来消除>构造中的结束字符之间的歧义Dictionary<String, Array<Int>>.在此示例中,结束>字符不会被视为单个标记,然后可能会被误解为位移>>运算符.
certain constructs在这种情况下指的是什么?实际语法只包含一个提及类型参数的生产规则:
显式构件表达→后缀表达式 …
compiler-construction generics grammar swift ambiguous-grammar
看看这个Java字节码(来自Eclipse ClassFile查看器),我发现invokeinterface指令有些奇怪:它有一个nargs(参数个数)'属性'占用2个字节:
35 aload_2 [map]
36 ldc <String "a"> [15]
38 invokeinterface java.util.Map.get(java.lang.Object) : java.lang.Object [33] [nargs: 2]
43 checkcast java.lang.String [35]
46 invokevirtual java.io.PrintStream.println(java.lang.Object) : void [47]
49 getstatic java.lang.System.out : java.io.PrintStream [41]
Run Code Online (Sandbox Code Playgroud)
为什么会这样?invokeinterface和之间有什么区别invokevirtual?JVM是否应该能够从给定的方法签名中推断出参数的数量(因此从堆栈中弹出的值的数量)?
我对字符列表和scala的int感到困惑.这是我的例子:
scala> var s = "123456"
s: String = 123456
scala> s.map(_.toInt)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(49, 50, 51, 52, 53, 54)
scala> s.map(_.toInt).sum
res1: Int = 309
Run Code Online (Sandbox Code Playgroud)
字符转换为ASCII代码我假设,如何只改变其值的字符?
谢谢
我写了一个for循环来遍历Map,我希望这个函数在找到某个值时立即返回键(键和值都是Int类型)
var hs:Map[Int,Int] = Map(1 -> 1, 2 -> 2)
for ((k,v) <- hs) {
if (v == 1)
return k
}
Run Code Online (Sandbox Code Playgroud)
但是,scala 给我错误消息:
error: type mismatch;
found : Unit
required: Int
for ((k,v) <- hst)
^
one error found
Run Code Online (Sandbox Code Playgroud)
然后我改为
var result = 0
for ((k, v) <- hst){
if (v == 1)
result = k
}
result
Run Code Online (Sandbox Code Playgroud)
然后,效果很好。为什么第一个版本存在类型问题?
我有以下Scala类:
class Component(val node:Int, var start:Int, var c_size:Int)
Run Code Online (Sandbox Code Playgroud)
我像这样实例化它:
var comp = new Component(1, 1, 1)
Run Code Online (Sandbox Code Playgroud)
然后,我尝试访问其中一个字段:
for(neighbour <- graph[comp.node]) ...
Run Code Online (Sandbox Code Playgroud)
但是,在这一点上,我收到一个错误:
错误:类型节点不是Component的成员
为什么这个领域不被认可?