多个参数列表,例如def foo(a:Int)(b:Int) = {}每个列表的多个参数,例如def foo(a:Int, b:Int) = {},就我所知,在语义上是等效的,并且大多数函数语言只有一种方式来声明多个参数,例如F#.
我可以找到支持这两种函数定义样式的唯一原因是允许使用只有一个参数的参数列表进行类似语法的语言扩展.
def withBufferedWriter(file: File)(block: BufferedWriter => Unit)
Run Code Online (Sandbox Code Playgroud)
现在可以使用syntax-looking调用
withBufferedWriter(new File("myfile.txt")) { out =>
out write "whatever"
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果没有多个参数列表,可能还有其他方法可以支持花括号的使用.
一个相关的问题:为什么在Scala中使用多个参数列表称为"currying"?Currying通常被定义为为了支持部分应用而使n-ary函数一元化的技术.但是,在Scala中,可以部分应用函数,而不会使函数的"curried"(多个参数列表,每个参数列表).
当我在Windows上进行多平台测试时,由于我在特殊的Mac自定义任务中使用了com.apple.eawt代码,因此Eclipse显示项目中的错误变得很烦人.更糟糕的是,如果我在Windows上导出一个可运行的jar,由于未解决的编译问题,它将无法在mac上运行.
让Windows Java和com.apple.eawt和平相处的最好方法是什么?我无法看到我如何能够将代码分离到jar,因为它需要访问程序的大部分状态.
警告:我是从#scala交叉发帖的
Scala中的Programming一书指出,路径依赖类型根据所讨论路径的确切实例而有所不同.如果是这样,我不明白为什么以下所有谓词都返回true:
class Outer {
val in = new Inner
class Inner
}
val o1 = new Outer
val o2 = new Outer
o1.in.isInstanceOf[Outer#Inner] //makes perfect sense
o1.in.isInstanceOf[o1.Inner] //still makes sense, the path-dependent type is o1's own
o1.in.isInstanceOf[o2.Inner] //why is this true? PiS p.423 says the path-dependent types are different, they only share a common supertype Outer#Inner
Run Code Online (Sandbox Code Playgroud) 我在网上找到了很多参考资料(包括一些关于stackoverflow的参考文献),JNA用于C++库,但我在JNA文档中找不到的任何内容都表明这是可行的.特别是似乎没有任何方法可以包装C++类.
我需要本机访问才能使用RTAudio,但RTAudio的所有函数都是RTAudio类的成员函数.所以只是为了证实,JNA不是正确的方法吗?
我想将我的scalac插件拆分成多个文件.这听起来很容易,但由于线路产生的路径依赖类型问题,我无法将其拉下来import global._.
这是Lex Spoon的示例插件:
package localhost
import scala.tools.nsc
import nsc.Global
import nsc.Phase
import nsc.plugins.Plugin
import nsc.plugins.PluginComponent
class DivByZero(val global: Global) extends Plugin {
import global._
val name = "divbyzero"
val description = "checks for division by zero"
val components = List[PluginComponent](Component)
private object Component extends PluginComponent {
val global: DivByZero.this.global.type = DivByZero.this.global
val runsAfter = "refchecks"
// Using the Scala Compiler 2.8.x the runsAfter should be written as below
// val runsAfter = List[String]("refchecks");
val phaseName …Run Code Online (Sandbox Code Playgroud) 从命令行启动时,某些程序会立即返回,例如Firefox.大多数实用程序(以及我编写的所有程序)都与创建它们的shell绑定在一起.如果你控制命令行,程序就死定了.
你有什么必须添加到程序或shell脚本以获得立即返回的行为?我想我在那里问了两个问题,一个用于shell脚本,一个用于一般,如果它们不同的话.我特别想知道是否有办法让一个可执行的jar来做.
我几乎不好意思问一个,但我自己找不到答案.
谢谢!
现在我正在使用JNA进行Java本地通信,并对其简单性感到满意.但是,我确实需要优化性能,并考虑使用其他绑定.
我的问题是:Java本地通信的哪个部分是"昂贵的"部分?是他们之间传递数据吗?
让我换一种说法.现在我的JNA接口调用的函数根本不会将任何数据传递给Java,甚至不会经常调用这些函数.换句话说,Java调用库调用,然后库调用会自行执行一段时间并返回基本类型.在这种情况下,JNI/Swig /等会比JNA更快吗?
我注意到Scala标准库使用两种不同的策略来组织类,特征和单例对象.
使用其成员为导入的包.例如,这是您访问的方式scala.collection.mutable.ListBuffer.这种技术很熟悉来自Java,Python等.
使用特征的类型成员.例如,这是您访问该Parser类型的方式.你首先需要混入scala.util.parsing.combinator.Parsers.这种技术不熟悉来自Java,Python等,并且在第三方库中使用不多.
我猜(2)的一个优点是它组织了方法和类型,但根据Scala 2.8的包对象,可以使用(1)完成相同的操作.为什么要有这两种策略?什么时候应该使用?
我已经在Linux和Mac上成功编译了我的库,并将其与Java Native Access一起使用。不幸的是,我似乎无法对Visual Studio的编译器和Java Native Access进行任何操作。
我将回到基础知识,并尝试在Visual Studio中创建Java Native Access可以使用的超简单dll,我们将不胜感激。
这是GimmeFiveDll.c:
__declspec(dllexport) int gimmeFive()
{
return 5;
}
Run Code Online (Sandbox Code Playgroud)
这是SystemLibrary.java:
import com.sun.jna.Native;
public class SystemLibrary {
public static final SystemLibrary instance = new SystemLibrary();
static {
Native.register("GimmeFiveDll");
}
public native int gimmeFive();
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在Visual Studio中将调用接口切换为stdcall。我没有从新项目向导的空项目dll win32控制台默认值中进行任何其他更改。在上面的示例中,生成的dll甚至没有根据正确导出函数dumpbin.exe /exports。我的真实项目确实正确导出了它们,但是无论哪种方式,我总是会得到相同的JNA异常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'GimmeFiveDll': The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)
(是的,我将GimmeFiveDll.dll放入System32中。是的,我能够使用JNA来访问Windows随附的System32中的其他dll)。
是否有人愿意帮助我完善一下JNA喜欢的Visual Studio创建的dll的极简示例?
非常感谢。
我注意到一些静态分析器在源代码上运行,而其他静态分析器在字节码上运行(例如,FindBugs).我确信甚至有一些可以处理目标代码.
我的问题很简单,为不同级别的分析编写不同类型的静态分析仪有哪些优点和缺点?
在"静态分析仪"下,我包括短绒,虫子发现者,甚至是完整的验证者.通过分析级别,我将包括可访问所有阶段的源代码,高级IR,低级IR,字节码,目标代码和编译器插件.
我正在测试我的插件,在进程中运行它像这样:
type PluginMessage = StoreReporter#Info
def runPlugin(fileName: String): List[PluginMessage] = {
val settings = new Settings
settings.outputDirs setSingleOutput (curDir + "/target")
settings.classpath.tryToSet(List(
"project/boot/scala-" + scalaVersion + "/lib/scala-compiler.jar" +
":project/boot/scala-" + scalaVersion + "/lib/scala-library.jar"))
val reporter = new StoreReporter
val compiler = new Global(settings, reporter) {
override protected def computeInternalPhases() {
super.computeInternalPhases
for (phase <- new AlacsPlugin(this).components)
phasesSet += phase
}
}
(new compiler.Run).compile(List(testPrefix + fileName))
reporter.infos.toList
}
Run Code Online (Sandbox Code Playgroud)
但是,鉴于速度慢,scalac我真的希望编译在某个阶段之后结束(特别是在我的插件运行之后).不幸的Global.cancel是没有预期的效果.我怎么能这样做?
更新:经过多次阅读后我发现这个问题非常普遍,你不能在同一个进程中混合架构,所以64位Java不能dlopen()像FMOD这样的32位库.有没有可能的解决方法,请记住我正在编写自己的FM接口到FMOD库?
我需要在Max OS X上制作64位dylib,因为Java Native Access只喜欢64位机器上的64位库.问题是,我的C源代码动态地包含FMOD,它在Mac上只提供32位dylib.当我尝试编译时没有-m32选项(因为我必须输出64位dylib)我得到以下错误:
gcc -dynamiclib -std=c99 -pedantic -Wall -O3 -fPIC -pthread -o ../bin/libpenntotalrecall_fmod.dylib ../../src/libpenntotalrecall_fmod.c -lfmodex -L../../lib/osx/
ld: warning: in /usr/lib/libfmodex.dylib, missing required architecture x86_64 in file
Undefined symbols:
"_FMOD_System_CreateSound", referenced from:
_startPlayback in ccJnlwrd.o
"_FMOD_Channel_GetPosition", referenced from:
_streamPosition in ccJnlwrd.o
"_FMOD_System_Create", referenced from:
_startPlayback in ccJnlwrd.o
"_FMOD_System_PlaySound", referenced from:
_startPlayback in ccJnlwrd.o
"_FMOD_Sound_Release", referenced from:
_stopPlayback in ccJnlwrd.o
"_FMOD_Channel_IsPlaying", referenced from:
_playbackInProgress in ccJnlwrd.o
"_FMOD_System_Update", referenced from:
_streamPosition in ccJnlwrd.o
_startPlayback in ccJnlwrd.o …Run Code Online (Sandbox Code Playgroud)