假设我在这里有这个代码:
do_recv_loop(State) ->
receive
{do,Stuff} ->
case Stuff of
one_thing ->
do_one_thing(),
do_recv_loop(State);
another_thing ->
do_another_thing(),
do_recv_loop(State);
_ ->
im_dead_now
end
{die} -> im_dead_now;
_ -> do_recv_loop(State)
end.
Run Code Online (Sandbox Code Playgroud)
现在,理论上这是尾递归的,因为对do_recv_loop的三次调用都不需要返回任何内容.但是,erlang会认识到这是尾递归并适当优化吗?我担心嵌套结构可能使它无法识别它.
这是我遇到的问题的一个例子:
package main
import "fmt"
func foo(a int, b ...int) {
fmt.Println(a,b)
}
func main() {
a := 0
aa := 1
b := []int{2,3,4}
foo(a, aa, b...)
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到了错误too many arguments in call to foo.我想我可以理解为什么会发生这种情况,但我不清楚的是我如何能够绕过它而不必b在开始时使用额外的插槽复制aa(我不想这样做,因为这段代码将经常运行b并且有点长).
所以我的问题是:我只是做错了吗?如果没有,那么做我想做的事情最有效的方法是什么?
(另外,我无法更改签名foo).
我正在运行ArchLinux,内核3.4.4,bash版本4.2.29.我从这里下载了android sdk:http://developer.android.com/sdk/index.html
提取后,我做了,~/android-sdk-linux/tools/android安装并安装了SDK平台工具包.
从那里我尝试了以下内容:
> ls -l ~/android-sdk-linux/platform-tools/adb
-rwxr-xr-x 1 mediocregopher mediocregopher 204436 Jun 28 13:20 /home/mediocregopher/android-sdk-linux/platform-tools/adb
> file ~/android-sdk-linux/platform-tools/adb
/home/mediocregopher/android-sdk-linux/platform-tools/adb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
> ~/android-sdk-linux/platform-tools/adb
bash: /home/mediocregopher/android-sdk-linux/platform-tools/adb: No such file or directory
Run Code Online (Sandbox Code Playgroud)
很明显,文件存在,至少可执行文件,为什么bash似乎无法找到它?我已经尝试将platform-tools文件夹添加到我的路径以及sudo和su-ing,但无论看起来什么样的文件都找不到.有谁知道会发生什么?
我正在寻找一种方法来启动clojure中的子进程(java很好),并将其输出实时直接发送到stdout.我能找到的最接近的是用于clojure的Conch库,它允许您将输出发送到*out*,但它实际上并不显示输出,直到该过程完成运行.
我不仅从学术角度而非实际角度对此感兴趣; 我不打算创建一个生产网络服务器来与nginx竞争.我想知道的是nginx究竟是如此之快.最热门的谷歌回应就是这个帖子,但它只是链接到一个神秘的幻灯片和不同的io策略的一般覆盖.所有其他结果似乎只是描述了nginx的速度,而不是原因.
我尝试构建一个简单的erlang服务器来尝试与nginx竞争,但无济于事; nginx赢了.我的所有服务器都为每个请求生成一个新进程,使用该进程将文件读取到套接字,然后关闭文件并终止该线程.这并不复杂,但考虑到erlang的轻量级进程和底层的aio结构,我认为它会竞争,但在重压力测试下,nginx仍能以300毫秒的平均值获胜.
什么是nginx做我的简单服务器不是?我的第一个想法是将文件保存在主内存中,而不是在请求之间抛出它们,但文件系统缓存已经这样做了,所以我认为它不会产生那么大的差别.我错了吗?或者还有其他我想念的东西?
我正在开发一个clojure项目,它可以与任何java类互操作,所以我的问题的答案可能是java或clojure.
基本上我需要能够根据给定的分隔符(将超过一个字符)将字符串拆分为组件,但同时保留分隔符.
例如:
splitting "test:test:test" on ":" => [ "test" ":" "test" ":" "test" ]
splitting "::test::test::" on "::" => [ "::" "test" "::" "test" "::" ]
Run Code Online (Sandbox Code Playgroud)
我使用clojure来使用壁橱clojure.string/split,但它实际上并没有返回分隔符.第二个最接近的是使用StringTokenizer,它确实返回分隔符但不接受多字符分隔符.
有没有人知道任何解决方案,然后只是将字符串分成一系列字符并运行奇怪的减少?
我有以下代码:
(ns alephtest.core
(:use lamina.core aleph.tcp aleph.formats))
(defn connection-established [socket]
(println "Socket connection established")
(on-closed socket #(println "closed"))
(doseq [line (line-seq (java.io.BufferedReader. *in*))]
(enqueue socket line)))
(defn -main []
(on-realized (tcp-client {:host "localhost" :port 9000})
connection-established
#(println "error:" %)))
Run Code Online (Sandbox Code Playgroud)
它现在所做的只是连接到本地服务器,然后将数据从stdin传递到服务器.这部分工作正常(on-closed socket #(println "closed")).如果我在客户端仍在运行时终止服务器,我应该收到一条消息说"关闭"到控制台,但我从来没有这样做过.
我的最终目标是创建某种恢复代码,这样如果服务器发生故障,客户端会在等待服务器返回时排队消息,当服务器确实返回时,它将重新连接并发送排队的一切.
我正在运行 arch,在我之前设置的一个项目中,我使用 virtualenv 设置了一个小 python 沙箱。此时,我的机器上的默认 python 版本是 3.2 它已经升级到 3.3,但是当我进入我的(现在旧的)virtualenv 并尝试运行 python 时,我收到错误:
python: error while loading shared libraries: libpython3.2mu.so.1.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是我可以解决的问题,以便将来如果/当我升级我的 python 时,我最终不会丢失旧的 virtualenv 需要的库?
给定一个输入流,我想以字节数组(块)的形式创建一个懒惰的数据序列.这是我的尝试:
(defn- read-or-nil [stream]
(let [buf (byte-array 2)]
(when-not (= -1 (.read stream buf))
buf)))
(defn byte-chunk-seq [stream]
(cons (read-or-nil stream) (lazy-seq (byte-chunk-seq stream))))
(with-open [rdr (java.io.FileInputStream. "/tmp/wut")]
(take 2 (byte-chunk-seq rdr)))
Run Code Online (Sandbox Code Playgroud)
在上一个语句中,我正在测试代码,我得到一个:
IOException Stream关闭java.io.FileInputStream.readBytes(FileInputStream.java:-2).
如果我将语句更改为a take 1然后它返回正常,但这对我没有多大帮助.有没有人有任何想法为什么这不起作用?
我有以下代码:
package main
import "fmt"
func main() {
fmt.Println(interface{}(1) == interface{}(1))
var a *int
fmt.Println(a == nil)
fmt.Println(interface{}(a) == interface{}(nil))
}
Run Code Online (Sandbox Code Playgroud)
它输出:
true
true
false
Run Code Online (Sandbox Code Playgroud)
我想知道为什么.在第一种情况下,可以看出,将一个值包装在一个interface{}不会停止等式的确定,并且nil包含在一个中的零指针(等于)与interface{}它不相同interface{}(nil).为什么是这样?