小编Med*_*her的帖子

erlang如何处理与尾递归混合的case语句

假设我在这里有这个代码:

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会认识到这是尾递归并适当优化吗?我担心嵌套结构可能使它无法识别它.

erlang recursion case tail

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

Go:Variadic函数和太多参数?

这是我遇到的问题的一个例子:

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).

variadic-functions go

10
推荐指数
2
解决办法
4263
查看次数

Bash找不到adb,即使它肯定存在

我正在运行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,但无论看起来什么样的文件都找不到.有谁知道会发生什么?

linux android adb

9
推荐指数
2
解决办法
5101
查看次数

将子进程输出直接输出到stdout(java/clojure)

我正在寻找一种方法来启动clojure中的子进程(java很好),并将其输出实时直接发送到stdout.我能找到的最接近的是用于clojure的Conch库,它允许您将输出发送到*out*,但它实际上并不显示输出,直到该过程完成运行.

java clojure exec

8
推荐指数
2
解决办法
753
查看次数

Nginx的速度,以及如何复制它

我不仅从学术角度而非实际角度对此感兴趣; 我不打算创建一个生产网络服务器来与nginx竞争.我想知道的是nginx究竟是如此之快.最热门的谷歌回应就是这个帖子,但它只是链接到一个神秘的幻灯片和不同的io策略的一般覆盖.所有其他结果似乎只是描述了nginx的速度,而不是原因.

我尝试构建一个简单的erlang服务器来尝试与nginx竞争,但无济于事; nginx赢了.我的所有服务器都为每个请求生成一个新进程,使用该进程将文件读取到套接字,然后关闭文件并终止该线程.这并不复杂,但考虑到erlang的轻量级进程和底层的aio结构,我认为它会竞争,但在重压力测试下,nginx仍能以300毫秒的平均值获胜.

什么是nginx做我的简单服务器不是?我的第一个想法是将文件保存在主内存中,而不是在请求之间抛出它们,但文件系统缓存已经这样做了,所以我认为它不会产生那么大的差别.我错了吗?或者还有其他我想念的东西?

erlang nginx

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

Java/clojure:多个字符分隔符,并保留分隔符

我正在开发一个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,它确实返回分隔符但不接受多字符分隔符.

有没有人知道任何解决方案,然后只是将字符串分成一系列字符并运行奇怪的减少?

java string split clojure tokenize

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

Clojure(aleph)检测服务器何时断开连接

我有以下代码:

(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")).如果我在客户端仍在运行时终止服务器,我应该收到一条消息说"关闭"到控制台,但我从来没有这样做过.

我的最终目标是创建某种恢复代码,这样如果服务器发生故障,客户端会在等待服务器返回时排队消息,当服务器确实返回时,它将重新连接并发送排队的一切.

networking tcp clojure

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

Virtualenv 和 libpython

我正在运行 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 需要的库?

python-3.x

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

Clojure:从输入流创建一个懒惰的字节块序列

给定一个输入流,我想以字节数组(块)的形式创建一个懒惰的数据序列.这是我的尝试:

(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然后它返回正常,但这对我没有多大帮助.有没有人有任何想法为什么这不起作用?

inputstream clojure lazy-sequences

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

去和接口{}相等

我有以下代码:

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).为什么是这样?

interface go

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