【发布时间】:2015-07-14 18:35:45
【问题描述】:
我目前对学习 Elixir 非常感兴趣,我学习一门新语言的典型方法是用它构建简单的程序。
所以我决定编写一个(非常简单的)类似 grep 的程序(或模块),如下所示:
defmodule LineMatch do
def file(s, path) do
case File.open(path, [:read]) do
{:ok, fd} -> match s, fd
{_, error} -> IO.puts "#{:file.format_error error}"
end
end
defp match(s, fd) do
case IO.read fd, :line do
{:error, error} -> IO.puts("oh noez! Error: #{error}")
line -> match(s, line, fd)
end
end
defp match(s, line, fd) when line !== :eof do
if String.contains?(line, s) do
IO.write line
end
match(s, IO.read(fd, :line), fd)
end
defp match(_, _line, _) when _line === :eof do
end
end
这很可能不是最优雅的方式,而且我对函数式编程也很陌生,所以我没想到它会超级快。但它不仅不快,而且实际上是超级慢。太慢了,我可能犯了一些非常明显的错误。
谁能告诉我,它是什么以及如何使它变得更好?
我通常使用单独的 .exs 文件来测试代码,例如
case System.argv do
[searchTerm, path] -> LineMatch.file(searchTerm, path)
_ -> IO.puts "Usage: lineMatch searchTerm path"
end
【问题讨论】:
标签: elixir