小编Tra*_*ger的帖子

Scala的Reflection API

有谁知道Scala的全功能反射API的状态?

我知道您可以使用Java的反射API来做简单的事情,但这对Scala的语言功能不起作用.我发现了一篇描述实验性Scala Mirroring API 的有趣文章,但据我所知,这仍然是实验性的.我也发现了一个ScalaSigParser,但这似乎是相当低的水平.

这更像是一种好奇心,因为我目前正在玩Scala.我认为这个问题的答案对于对Scala感兴趣的其他人也可能有用.

reflection scala

12
推荐指数
1
解决办法
3032
查看次数

使用Apache Buildr编译Scala 2.8.x代码

我一直在努力让Buildr编译我的Scala 2.8项目,我希望有人可能已经想到了这一点.

目前我有标准的HelloWorld应用程序,其中包含如下构建文件:

ENV['JAVA_HOME'] = 'C:\Program Files (x86)\Java\jdk1.6.0_17'
ENV['SCALA_HOME'] = 'C:\scala-2.8.0.Beta1-RC6'

define "HelloWorld" do

  #artifact_ns['Buildr::Compiler::Scalac'].library = '2.8.0'
  require 'buildr/scala'

  puts Scala.version

end
Run Code Online (Sandbox Code Playgroud)

当我运行buildr时,我得到以下输出:

(在C:/ Users/Travis/eclipse_ws/HelloWorld,开发中)
2.7.5
构建HelloWorld将HelloWorld
编译到C:/ Users/Travis/eclipse_ws/HelloWorld/target/classes
Buildr中止了!
←[31mScala编译器崩溃:
#←[0m

第一个问题是NoClassDefFoundError - 它找不到scala编译器的主类.第二个问题是Scala.version打印出2.7.5.这是不正确的,因为SCALA_HOME路径指向2.8版本.

最后,使用--trace标志向我显示Buildr正在生成一个有点正确的scalac命令,当我手动运行该命令时,所有内容都会编译.我说它有点正确只是因为一些cp条目是重复的.请参阅以下内容:

scalac -classpath C:/scala-2.8.0.Beta1-RC6/lib/scala-library.jar; C:/scala-2.8.0.Beta1-RC6/lib/scala-compiler.jar; C:/ scala- 2.8.0.Beta1-RC6/lib/scala-library.jar; C:/scala-2.8.0.Beta1-RC6/lib/scala-compiler.jar -sourcepath C:/ Users/Travis/eclipse_ws/HelloWorld/src/main/scala -d C:/ Users/Travis/eclipse_ws/HelloWorld/target/classes -verbose -g C:/Users/Travis/eclipse_ws/HelloWorld/src/main/scala/hw/HelloWorld.scala

我尝试了另外一件事(但是错误的构建器)是设置以下内容(我认为不需要SCALA_HOME存在):

#artifact_ns['Buildr::Compiler::Scalac'].library = '2.8.0'
Run Code Online (Sandbox Code Playgroud)

那么任何想法?

下面是我的系统信息的快速列表:Win 7 64位JDK 6 32位本地设置为buildr但JDK 6 64位系统范围Ruby 1.8.6 32位Buildr 1.3.5 32位Scala 2.8.0.Beta1-RC6

我正在考虑做的另一件事是重新安装我的32位JDK并将其从名称中带有(x86)的目录中取出.虽然我不确定这是否与我当前的问题相关,但我发现Scala bat文件中的螺丝.

提前致谢!

scala buildr

7
推荐指数
1
解决办法
883
查看次数

在clojure中对数字序列进行分区

我有以下输入:

(def nums [123456789012 123456789012])
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

[[1234 5678 9012] [1234 5678 9012]]
Run Code Online (Sandbox Code Playgroud)

*注意这两个序列都包含数字而不是字符串......

我认为通过执行以下操作会非常简单:

  1. 将每个条目转换为String
  2. 将每个字符串分区为4
  3. 将每个分区转换回整数

这是我失败的尝试:

(defn split-nums [nums factor]
  (map
    #(map
       (fn [x] (Integer/valueOf (str x)))
       (partition factor (str %)))
  nums))

(println (split-nums nums, 4))
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到以下错误:

Caused by: java.lang.NumberFormatException: For input string: "clojure.lang.LazySeq@4834333c"
Run Code Online (Sandbox Code Playgroud)

这告诉我,我正在处理一个懒惰的序列,我需要强制评估,但当我尝试(str(doall x))我得到相同的结果.

所以我在哪里出错?这是一个好方法吗?BTW.我刚刚开始学习clojure,所以我当然不是专家.

clojure

3
推荐指数
1
解决办法
2504
查看次数

使用Eclipse JDT ASTRewrite以编程方式修改现有Java源代码作为独立应用程序

我有一个现有的Java应用程序,其中包含我想以编程方式修改的源文件.我需要能够对源文件进行分析,并根据该分析执行源转换.我还需要能够理解不同源文件之间的关系.我还想将此过程创建为独立的Java应用程序.

做了一点研究我发现了以下工具:代码模型和Eclipse JDT.我确定还有其他人.我已经排除了代码模型,因为它(据我所知)只允许生成新代码,不能使用现有代码.

Eclipse JDT库似乎符合我的所有需求.我能够轻松地解析源文件.我可以配置绑定,以便保留跨类型的信息.我现在遇到的问题是让ASTRewrite功能正常工作.看来(从我读过的例子和文档中)它只能在eclipse插件中运行.当我尝试使用重写器时,我收到以下错误:

java.lang.IllegalArgumentException: This API can only be used if the AST is created from a compilation unit or class file 

那么我可以在独立应用程序中使用ASTRewrite功能,还是需要开始查看其他工具?

java eclipse code-generation eclipse-jdt

1
推荐指数
1
解决办法
2356
查看次数