对JVM的哪些更改最有利于Scala编译器和运行时?
通过引入InvokeDynamic计划到达JVM 7 的字节代码,动态语言将在性能上受益匪浅,Scala可能会受益于尾递归(不确定它是否会出现在JVM 8或更高版本中).
Scala及其现有功能集可以从JVM中获益吗?这些变化即将到来吗?
具体来说,JVM是否会对闭包和函数作为对象提高性能?
什么是将数据结构转换为Java集合的Clojure-idiomatic方法,具体为:
[] 到了 java.util.ArrayList{} 到了 java.util.HashMap#{} 到了 java.util.HashSet() 到了 java.util.LinkedList是否有clojure.contrib库来执行此操作?
使用案例:为了使Clojure易于进入我的组织,我正在考虑为Clojure中的全Java REST服务器编写单元测试套件.我已经在Scala中编写了部分套件,但认为Clojure可能更好,因为宏支持将减少很多样板代码(我需要测试几十个类似的REST服务调用).
我使用EasyMock来模拟数据库连接(有更好的方法吗?),我的模拟方法需要将java.util.List<java.util.Map<String, Object>>项(表示数据库行集)返回给调用者.我会将一个[{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...]结构传递给我的mock并将其转换为所需的Java集合,以便它可以以预期的格式返回给调用者.
我搜索过Google和JetBrains网站,但是我找不到com.intellij包的文档.
有任何想法吗 (:-))?
是否有可能覆盖tsconfig.json从mocha调用时使用的ts节点?
我的主要tsconfig.json包含"module": "es2015",但我只想"module": "commonjs"用于ts节点.
我试过这个
mocha --compilers ts:ts-node/register,tsx:ts-node/register \
--compilerOptions '{"module":"commonjs"}' \
--require ts-node/register test/**/*.spec.ts*
Run Code Online (Sandbox Code Playgroud)
但它不起作用:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Module.m._compile (/usr/lib/node_modules/ts-node/src/index.ts:406:23)
at Module._extensions..js (module.js:422:10)
at Object.require.extensions.(anonymous function) [as .tsx] (/usr/lib/node_modules/ts-node/src/index.ts:409:12)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Module.require (module.js:367:17)
at require (internal/module.js:16:19)
at /usr/lib/node_modules/mocha/lib/mocha.js:222:27
at Array.forEach (native)
at Mocha.loadFiles (/usr/lib/node_modules/mocha/lib/mocha.js:219:14)
at Mocha.run (/usr/lib/node_modules/mocha/lib/mocha.js:487:10)
at Object.<anonymous> (/usr/lib/node_modules/mocha/bin/_mocha:458:18)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load …Run Code Online (Sandbox Code Playgroud) 据我所知,Scala具有Value(Int),Value(String)和Value(Int,String)的Enumeration Value类的定义.
有没有人知道创建一个新的Value子类来支持不同的构造函数的例子?
例如,如果我想创建一个带有Value(Int,String,String)对象的Enumeration,我该怎么做?我想要使用Enumeration类的所有其他好处.
谢谢.
我正在寻找这个问题的惯用解决方案.
我正在构建一个valScala(不可变)地图,并希望可选择添加一个或多个项目:
val aMap =
Map(key1 -> value1,
key2 -> value2,
(if (condition) (key3 -> value3) else ???))
Run Code Online (Sandbox Code Playgroud)
如何在不使用var?的情况下完成?什么应该取代????使用+运营商更好吗?
val aMap =
Map(key1 -> value1,
key2 -> value2) +
(if (condition) (key3 -> value3) else ???))
Run Code Online (Sandbox Code Playgroud)
一种可能的解决方案是
val aMap =
Map(key1 -> value1,
key2 -> value2,
(if (condition) (key3 -> value3) else (null, null))).filter {
case (k, v) => k != null && v != null
}
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?
我正在尝试创建一个def带有类型提示的字符串Clojure宏:
(defmacro def-string [name value]
`(def ^String ~name ~value))
(def-string db-host-option "db-host")
Run Code Online (Sandbox Code Playgroud)
当我macroexpand这样,类型提示丢失:
(macroexpand '(def-string db-host-option "db-host"))
;=> (def db-host-option "db-host")
Run Code Online (Sandbox Code Playgroud)
别担心提示这种类型的智慧.
为什么宏会丢失元数据?如何编写此宏或任何包含元数据的宏?
我试图在Haskell中mapM_的do块内重构一个函数调用.我想将lambda提取到(本地)命名函数,以使代码更具可读性.
我的代码最初看起来像这样:
do
-- ...
mapM_ (\x -> x + 1) aList
return aValue
Run Code Online (Sandbox Code Playgroud)
我想改成它
do
-- ...
mapM_ func aList
where func x = x + 1
return aValue
Run Code Online (Sandbox Code Playgroud)
但我在线上遇到语法错误return aValue.我的实际lambda更复杂:-),但我确实用同样的lambda尝试它,以确保它不是lambda代码中的问题.
我该如何重写这段代码?我应该用let...... in代替吗?
我知道这听起来像是对Lisp爱好者(以及其他动态语言爱好者)的亵渎,但是增强Clojure编译器以支持静态(编译时)类型检查有多难?
抛开支持和反对静态和动态类型的参数,这是否可行(不是"这是可行的")?
我想添加一个新的读取器宏来强制编译时类型(#^宏的增强版本)并将类型信息添加到符号表将允许编译器标记变量被滥用的位置.例如,在下面的代码中,我期望编译时错误(#*是"编译时"类型的宏):
(defn get-length [#*String s] (.length s))
(defn test-get-length [] (get-length 2.0))
Run Code Online (Sandbox Code Playgroud)
#^宏甚至可以与全局变量(*compile-time-type-checking*)一起重用,以强制编译器进行检查.
有关可行性的任何想法?
在另一个问题中,其中一条评论说," [Data.]Text正在成为事实上的文本实现.String由于遗留原因和简单的事情仍然存在,但对于你应该使用的严肃的文本操作Text."
将a转换为a的最简单方法Data.Text是Int什么?read将无法正常工作,因为该read功能总是需要一个String.
我能想到的最好的是:
let fortyTwo = Data.Text.pack "42"
read $ Data.Text.unpack fortyTwo :: Int
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
clojure ×3
scala ×3
haskell ×2
collections ×1
enumeration ×1
immutability ×1
java ×1
jvm ×1
macros ×1
mocha.js ×1
node.js ×1
string ×1
syntax ×1
tsconfig ×1
type-hinting ×1
where-clause ×1