Scala提供了一个名为stripMargin的方法,它将多行字符串的左侧部分删除到指定的分隔符(默认值为"|").这是一个例子:
"""|Foo
|Bar""".stripMargin
Run Code Online (Sandbox Code Playgroud)
返回字符串
Foo
Bar
Run Code Online (Sandbox Code Playgroud)
在Clojure中有类似的功能吗?如果没有,你将如何实现它(功能最多)?
谢谢.
更新:我给出的例子不完整.stripMargin方法还在分隔符后保留空格:
"""|Foo
| Bar""".stripMargin
Run Code Online (Sandbox Code Playgroud)
返回字符串
Foo
Bar
Run Code Online (Sandbox Code Playgroud) 我不得不注释掉下面的行(示例来自http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci)
(def fib-seq
;"Implements Fibonacci sequence (starts with 0)."
((fn rfib [a b]
(lazy-seq (cons a (rfib b (+ a b)))))
0 1))
Run Code Online (Sandbox Code Playgroud)
如果我把它留在里面,我会得到:
Clojure 1.2.0
java.lang.Exception: Too many arguments to def (Problem1.clj:1)
1:1 user=>
Run Code Online (Sandbox Code Playgroud)
但是,我可以用 来做到这一点defn。示例(我知道,我正在重新发明轮子,even?因为已经定义了):
(defn is-even? [n]
"Returns true if the number is even, false otherwise."
(== (mod n 2) 0))
Clojure 1.2.0
1:1 user=> (is-even? 3)
false
1:2 user=> (is-even? 4)
true
1:3 user=>
Run Code Online (Sandbox Code Playgroud) 在以下代码中:
def test(list: List[Any]): Unit = {
list.foreach {
v =>
v match {
case r: AnyRef => println(r + ": " + r.getClass.getName)
case d: Double => println(d + ": Double")
case f: Float=> println(f + ": Float")
case b: Byte => println(b + ": Byte")
case c: Char => println(c + ": Char")
case s: Short => println(s + ": Short")
case i: Int => println(i + ": Int")
case l: Long=> println(l + ": Long")
case b: …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个名为Clojure的实用程序函数map-longest(备用名称建议赞赏).此功能将具有以下"签名":
(map-longest fun missing-value-seq c1 & colls)
Run Code Online (Sandbox Code Playgroud)
并且将表现得类似map,除了它将继续处理提供的集合,直到最长的用尽.对于短于最长的集合,当它用完了值时,它将从中获取它们missing-values-seq.它应该是懒惰的,但显然不能与无限集合一起使用.
使用示例:
(print (apply str
(map-longest #(str %1 \space %2 \space %3 \newline) (repeatedly "--")
["a1" "a2" "a3"] ["b1" "b2"] ["c1" "c2" "c3" "c4"])))
Run Code Online (Sandbox Code Playgroud)
它应该产生以下输出:
a1 b1 c1
a2 b2 c2
a3 -- c3
-- -- c4
Run Code Online (Sandbox Code Playgroud)
但我可能有错误的电话.
我该如何实现?clojure.core或clojure-contrib库是否已经有类似的东西?作为替代方案missing-value-seq,传递第二个函数来生成缺失值会更好#(identity "--")吗(例如:在我的例子中)?
使用案例:我正在编写一个小文本蜘蛛纸牌播放器作为学习Clojure /函数式编程的练习.我需要能够显示游戏tableaus(纯粹主义者的表格:-)).
我正在Scala中编写一个包含"文件复制"actor的实用程序.我发送要复制的文件名,并且演员一次执行一个.
我如何使用代理在Clojure中做同样的事情?
我正在使用Apache commons cli(1.2)进行命令行解析.
我的代码中有以下内容:
import org.apache.commons.cli.OptionBuilder
OptionBuilder.withLongOpt("db-host").hasArg.
withDescription("Name of the database host").create('h')
Run Code Online (Sandbox Code Playgroud)
我收到了错误hasArg is not a member of org.apache.commons.cli.OptionBuilder.这没有什么区别,如果我改变.hasArg对.hasArg().
为什么?
BTW,Java解析这个问题.
在下面的代码中,Clojure(1.2)正在打印错误的消息:
(try
(let [value "1,a"]
(map #(Integer/parseInt %) (.split value ",")))
(catch NumberFormatException _ (println "illegal argument")))
Run Code Online (Sandbox Code Playgroud)
这应该打印"非法参数",而是打印出来(1#<NumberFormatException java.lang.NumberFormatException: For input string: "a">.
我究竟做错了什么?
这是因为返回的懒惰序列map?怎么写?
我正在编写Java代码生成器.
我有一个不可变的Map,它包含从java.sql.Types[Int]到(String, String)第一个值为Java类型的元组的映射,第二个是Java包,如果默认情况下未导入该类型,则从该包导入该类型(java.lang):
val SqlTypesToJavaTypeNames =
Map(Types.BIGINT -> ("Long", None),
Types.BINARY -> ("byte[]", None),
Types.BIT -> ("Boolean", None),
Types.BOOLEAN -> ("Boolean", None),
Types.CHAR -> ("String", None),
Types.DATE -> ("Date", Some("java.sql.Date")),
Types.DECIMAL -> ("BigDecimal", Some("java.math.BigDecimal")),
Types.DOUBLE -> ("Double", None),
Types.FLOAT -> ("Float", None),
Types.INTEGER -> ("Integer", None),
Types.LONGNVARCHAR -> ("String", None),
Types.LONGVARCHAR -> ("String", None),
Types.NCHAR -> ("String", None),
Types.NUMERIC -> ("BigDecimal", None),
Types.NVARCHAR -> ("String", None),
Types.REAL -> ("Float", None),
Types.SMALLINT -> ("Short", None), …Run Code Online (Sandbox Code Playgroud) java.util.concurrent在多线程环境中是否有任何已发布的微基准测试将Scala可变和不可变集合与其他集合进行比较?我特别感兴趣的是读者远远超过编写者,比如在服务器端代码中缓存HashMaps.
Clojure集合的微观基准也是可以接受的,因为它们的算法类似于Scala 2.8持久集合中使用的算法.
如果没有做过,我会写自己的,但写好的微基准并不是微不足道的.
clojure ×6
scala ×5
actor ×1
collections ×1
easymock ×1
function ×1
immutability ×1
map ×1
metadata ×1
mocking ×1
mockito ×1
parsing ×1
scala-option ×1
string ×1
xml ×1