小编mgw*_*ann的帖子

Elixir或Hex便携包格式?

elixir代码有可移植格式吗?除了明显的焦油.

例如,如果我想向客户端或其他团队的开发人员提供一个或多个模块(不使用github).我该怎么办?

其他一些熟悉的语言的答案是:Ruby - gem,Java - jar,Python - egg等.

elixir

15
推荐指数
1
解决办法
3963
查看次数

Elixir错误"erlang error :: guard_expr"

iex控制台上,我发现以下错误,我不确定我做错了什么...

case %{} do
  x when x == %{} -> true
  _x -> false
end
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

** (ErlangError) erlang error: :guard_expr
Run Code Online (Sandbox Code Playgroud)

另外,我想解释一下我是如何找到这个的.我试图让我自己||看的灵药的实现,改变它来治疗宏[],{}%{}falsenil. https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313

这是实现(它有同样的问题):

defmodule Or do
  defmacro left || right do
    quote do
      case unquote(left) do
        x when x in [false, nil] or x == [] or x == {} or x == %{} ->
          unquote(right)
        x ->
          x
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

带走or …

elixir

9
推荐指数
1
解决办法
161
查看次数

Elixir Macro:Power**功能

通过Elixir源我看到乘法定义如下:

@spec (number * number) :: number
def left * right do
  :erlang.*(left, right)
end
Run Code Online (Sandbox Code Playgroud)

我想做一个**功能来做力量作为练习.但是,当我尝试时,我得到一个例外,我无法弄清楚如何正确地做到这一点.

@spec (number ** number) :: number
def left ** right do
  :math.pow(left, right)
end
Run Code Online (Sandbox Code Playgroud)

总是抛出一个错误:

** (SyntaxError) iex:7: syntax error before: '*'
Run Code Online (Sandbox Code Playgroud)

我尝试使用unquote将其设为宏,使用:"**"而不是**.不知道为什么这不起作用......

有任何想法吗?

macros elixir

9
推荐指数
1
解决办法
1338
查看次数

Elixir - GenServer,具有其他几个GenServer pids的初始状态

我遇到了自动启动监督树的死锁问题.一个GenServer的初始状态是树中另一个主管的子工作者.这是代码:

主管和工人:

defmodule Parallel.Worker.Supervisor do
  import Supervisor.Spec

  def start_link do
    # Start up a worker for each core
    schedulers = :erlang.system_info(:schedulers)
    children = Enum.map(1..schedulers,
      &(worker(Parallel.Worker.Server, [], id: "Parallel.Worker#{&1}")))

    opts = [strategy: :one_for_one, name: Parallel.Worker.Supervisor]
    Supervisor.start_link(children, opts)
  end

  def workers do
     Process.whereis(Parallel.Supervisor)
      |> Supervisor.which_children
      |> Enum.reduce [], fn
        {_name, pid, :worker, _module}, acc -> [{make_ref, pid} | acc]
        _, acc -> acc
      end
  end

end
Run Code Online (Sandbox Code Playgroud)

具有这些工人pids状态的GenServer:

defmodule Parallel.Process.Server do
  use GenServer

  def start_link do
    GenServer.start_link(__MODULE__, workers: [Parallel.Worker.Supervisor.workers])
  end
end
Run Code Online (Sandbox Code Playgroud)

正如你在最后一行所看到的,我正在调用"Parallel.Worker.Supervisor.workers",它似乎阻止在树上等待初始化,直到此方法返回才会完成.如何将监督的PID作为初始GenServer状态?

更新: …

elixir

3
推荐指数
1
解决办法
1125
查看次数

凤凰城:从IEx控制台广播

我已经建立了一个像这里的小聊天应用程序:https: //github.com/chrismccord/phoenix_chat_example/blob/master/web/channels/room_channel.ex

并且无法弄清楚如何向主题中的所有用户广播消息.在上面的应用程序中(我没有像我正在使用的那样更新到v0.13),我该怎么做?以下是我没试过的尝试:

Phoenix.PubSub.broadcast Chat.PubSub, "new:msg", "hello from the console"
Phoenix.PubSub.broadcast Chat.Endpoint, "new:msg", "hello from the console"
Phoenix.PubSub.broadcast Chat.RoomChannel, "new:msg", "hello from the console"
Run Code Online (Sandbox Code Playgroud)

他们都没有工作...他们中的一些抛出异常:(

elixir phoenix-framework

2
推荐指数
1
解决办法
756
查看次数

标签 统计

elixir ×5

macros ×1

phoenix-framework ×1