我已经完成了一些Java编程和很少的C和PHP编程.最近我开始学习Python,因为语言似乎很有趣.
但SO上的几篇文章似乎指出Python不适合并发编程.与那些拥有编译器的语言相比,它也更慢.我也喜欢静态类型语言的优点,但Python是动态类型的.所以我的问题是,是否有一种语言符合以下标准.
1)有翻译(为了更快的发展)
2)有一个编译器(因为编译的代码运行得更快)
3)具有OO功能
4)静态打字
我遇到了满足上述标准的OCaml.但SO上的帖子让我相信OCaml不适合并发编程.所以第五个标准是
5)适合并发编程.
PS: - 我不是编程语言方面的专家,所以如果我上面的任何观察结果有误,请耐心等待.
python interpreter ocaml programming-languages static-typing
根据MSDN文档,在编写递归函数时,使用accumulator参数使函数tail递归,从而节省了堆栈空间.我在MSDN网站上使用了两个例子来计算列表中所有数字的总和 -
首先没有尾递归 -
let rec Sum myList =
match myList with
| [] -> 0
| h::t -> h + Sum t
Run Code Online (Sandbox Code Playgroud)
现在有尾递归 -
let Sumtail list =
let rec loop list acc =
match list with
| h::t -> loop t acc + h
| [] -> acc
loop list 0
Run Code Online (Sandbox Code Playgroud)
并使用输入运行这两个函数[1..100000].函数Sum成功计算了此列表的总和,但是如果我通过[1..1000000]
但是第二个函数Sumtail 失败,则会给出stackoverflow异常,[1..100000]而它应该提供比第一个函数更好的性能,因为它使用尾递归.还有其他因素会影响递归函数吗?
如何编写一个等于下面的c#代码的F#方法?试图谷歌它,但找不到任何工作.谢谢.
public List<Tuple<long, string, string>> Fun(List<Tuple<long, string>> param)
{
var ret = new List<Tuple<long, string, string>>();
foreach (var tuple in param)
{
ret.Add(new Tuple<long, string, string>(tuple.Item1, tuple.Item2, "new val"));
}
return ret;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个能够对用户输入做出反应的简单elixir程序.我的问题是从stdio读取似乎不起作用.如果我的整个想法很愚蠢,请告诉我一个如何完成的例子.我在网上找不到任何东西
我把问题简化为一个简单的例子:
t = Task.async((fn->IO.gets "what?" end))
%Task{owner: #PID<0.65.0>, pid: #PID<0.80.0>, ref: #Reference<0.0.2.135>}
Run Code Online (Sandbox Code Playgroud)
任务开始:
iex(4)> pid=Map.get(t, :pid)
#PID<0.80.0>
iex(5)> Process.alive? pid
true
Run Code Online (Sandbox Code Playgroud)
并且它不会打印到stdio也不会读取.它没有正常退出或有异常.我也尝试过IO.read/2.
在我的程序中,Task以Task.spawn_link/1启动,但问题是相同的.IO.gets/2和IO.gets/2函数后面的代码没有执行.
主管开始任务:
defmodule Prime do
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
# Define workers and child supervisors to be supervised
worker(Task, [fn->Prime.IO.communicate(nil) end], restart: :transient),
supervisor(Prime.Test.Supervisor, [])
]
opts = [strategy: :one_for_one, name: Prime.Supervisor]
Supervisor.start_link(children, opts) end end
Run Code Online (Sandbox Code Playgroud)
任务功能:
defmodule Prime.IO do
@doc """
handles communication with the user and …Run Code Online (Sandbox Code Playgroud) 我有与此非常相似的代码(我稍微简化了代码以演示我试图弄清楚的行为的本质)。
public async System.Threading.Tasks.Task<bool> IsNumberOdd(int numToTest)
{
if (numToTest % 2 == 0)
{
return false;
}
else
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不使用async关键字,我会收到关于无法将 abool转换为a 的抱怨Task<bool>。我假设这里涉及一些语法糖。查看 IL(我对 IL 不太熟悉)似乎 async 关键字导致任务运行,然后返回值是任务的结果。我理解正确吗?
顺便说一句,如果这是一个骗局,或者如果有一些博客文章讨论了这个问题,请随时指出并关闭它。我不是想给我的代表打气;我试图了解这段代码发生了什么。
编辑:
对于那些问“为什么这个方法是异步的?”的人——因为我试图构建一个小而简单的代码示例来演示这个问题。我还应该添加一个调用代码的示例,但我试图使代码尽可能小而简单。
我对Elixir中的二进制文件和字符串感到困惑.我有一个功能.返回表示字符串的二进制字符代码,但我无法弄清楚如何以清晰的方式打印该字符串.我正在考虑将二进制文件转换为字符列表,然后枚举字符列表并将每个字符串转换为字符串,但这似乎很多工作.有没有更好的办法?
药剂1.3.2
Erlang / OTP 19
Windows 7(标准用户和管理员)
我正在尝试破解一个小的Elixir脚本,以将提交文件提交给git。为了确保我不会意外暂存emacs创建的临时文件,我要做的第一件事是File.rm(“ *〜”)。但是,这就是我得到的:
iex(2)> File.rm("*~")
{:error, :eio}
Run Code Online (Sandbox Code Playgroud)
所以我尝试了File.rm("*.*~")。结果相同。当我以标准用户身份(这是我通常在Windows上的工作方式)或以管理员身份运行时,我会得到相同的行为,因此似乎也没有任何权限。
因此,我将文件捕获到一个列表中。
iex(15)> {:ok,files} = File.ls
{:ok,
[".git", ".gitattributes", ".gitignore", "add.factor", "async_ut",
"async_ut.cs", "cng_maint", "codecvg.cmd", "codecvg_rkt.cmd",
"codecvg_rkt.cmd~", "CreateBr.vbs", "DevSandbox", "distillery", "dk.cmd",
"example.scm", "example.sql", "factor", "fsele", "fsharp", "glp.vbs",
"lwwtww.org", "mrgmain.cmd", "MrgMain.vbs", "mrgtrunk.cmd", "mrgtrunk.cmd~",
Run Code Online (Sandbox Code Playgroud)
(为了节省空间而将其截短)
我可以检查包含列表中的字符串,~然后返回true。所以我没有想象波浪号在那里。
我test.txt在目录中创建了一个临时文件。 File.rm删除了那一个就好了,所以似乎与~引起问题的原因有关。我也尝试了这些:
iex(7)> File.rm("*\~")
{:error, :eio}
iex(8)> File.rm("*\7F") #7F is hex code of ~
{:error, :eio}
Run Code Online (Sandbox Code Playgroud)
如您所见,没有运气。
:eio使用Elixir和File.rm 进行的任何搜索都没有发现任何有用的信息。我可以尝试安装1.4.0,看看是否有效果,但是我只是想看看我是否在这里缺少了一些愚蠢而明显的东西。
我在计算机上也安装了cygwin,因此尝试以这种方式删除文件。 rm *~完全按预期工作(在标准用户下)。 …
我检查了h和h(IEx)并且没有提出任何问题.
我相信我可以在命令提示符下运行并运行"混合格式",但我想知道我是否遗漏了一些东西.是否有任何类似于重新编译/ 0或r/1 for iex的命令允许我重新格式化项目中的源文件?
嘿,我正在尝试进行查询,我的代码如下所示:
def show(conn, _params) do
user = Guardian.Plug.current_resource(conn)
team = Web.get_team!(user.team.id)
score_query =
from(
u in User,
where: u.team.id == team.id,
select: sum(u.score)
)
team_score = Repo.all(score_query)
IO.puts("score")
IO.inspect(team_score)
conn |> render("team.json", team: team)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,我收到一条错误消息:
** (Ecto.Query.CompileError) unbound variable `team` in query
Run Code Online (Sandbox Code Playgroud)
但为什么是未绑定的?我该如何修复它以及为什么会发生这种情况?