问题标签 [elixir]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
12346 浏览

dynamic - 在 Elixir 或 Erlang 中,如何在运行时动态创建和加载模块?

基本场景是这样的:我需要从数据库中加载文本,然后将该文本转换为 Elixir 模块(或 Erlang 模块),然后对其进行调用。该文本实际上与模块文件相同。所以这是热代码加载的一种形式。我想编译“文件”,然后加载生成的模块,然后调用它。稍后我会卸载它。唯一的区别是代码存在于数据库中而不是磁盘上的文件中。(并且在我编写将加载它的代码时它不存在。)

我知道 Erlang 支持热代码加载,但似乎专注于在磁盘上编译文件然后加载梁。我希望将其作为一个更动态的过程来执行,并且我不会替换正在运行的代码,而是加载代码,然后运行它,然后卸载它。

Elixir 中有几个工具可以在运行时评估代码。我正在尝试弄清楚如何使用它们,并且文档有点稀疏。

“返回一个元组列表,其中第一个元素是模块名称,第二个是它的二进制”。所以,现在我有了模块名称和它们的二进制文件,但我不知道如何将二进制文件加载到运行时并调用它们。我该怎么做?(我可以看到代码库中没有相应的功能。)

可能我可以使用 Erlang 函数:

好的,所以这会返回一个带有原子“模块”的元组,然后是模块。如果从数据库加载的字符串定义了一个名为“Paris”的模块,那么我将如何在我的代码中执行

因为我事先不知道会有一个名为 paris 的模块?我可以知道,通过将字符串“paris”也存储在数据库中,这是名称,但是有没有办法调用模块,使用字符串作为您正在调用的模块的名称?

还有:

它评估字符串的内容。这个字符串可以是模块的完整定义吗?看来不是。我希望能够编写这个正在评估的代码,它具有多个相互调用的函数 - 例如一个完整的小程序,具有预定义的入口点(这可能是一个主要的,比如作为“DynamicModule.handle([参数,列表])”

然后是 EEx 模块,它有:

这对于制作模板非常有用。但最终它似乎只适用于存在字符串并且您已将 Elixir 代码嵌入其中的用例。它在选项的上下文中评估字符串并生成一个字符串。我正在寻求将字符串编译成一个或多个我可以调用的函数。(如果我只能制作一个很好的功能,那么该功能可以进行模式匹配或切换到做其他需要的事情......)

我知道这是非常规的,但我有这样做的理由,而且他们是好的。我正在寻找有关如何执行此操作的建议,但不需要被告知“不要那样做”。看起来应该是可能的,Erlang 支持热代码加载,并且 Elixir 非常动态,但我只是不知道语法或正确的功能。我会密切关注这个问题。提前致谢!


基于第一个答案的编辑:

感谢您的回答,这是一个很好的进展。正如 Yuri 所展示的, eval 可以定义一个模块,并且正如 José 指出的那样,我可以将代码 eval 用于带有绑定的一小部分代码。

正在评估的代码(无论是否转换为模块)将相当复杂。它的开发最好涉及将其分解为函数并调用这些函数。

为了提供帮助,让我提供一些背景信息。假设我正在构建一个 Web 框架。从数据库加载的代码是特定 URI 的处理程序。所以,当一个 HTTP 调用进来时,我可能会加载 example.com/blog/ 的代码。这个页面可能涉及几个不同的东西,比如评论、最近的帖子列表等。

由于很多人同时点击该页面,我正在生成一个进程来处理每个页面视图。因此,对于不同的请求,可以多次同时评估此代码。

模块解决方案允许将代码分解为页面不同部分的函数(例如:帖子列表、评论等),并且我会在启动时加载模块一次,并让许多进程产生该调用进去。该模块是全局的,对吗?

如果已经定义了一个模块会发生什么?EG:当模块发生变化时,已经有进程调用了该模块。

在 iex 中,我可以重新定义已经定义的模块:

如果我在运行时将模块重新定义到当前调用该模块的所有进程,会发生什么?此外,这种重新定义是否会在 iex 之外正常运行?

假设重新定义模块会有问题,并且全局模块可能会遇到命名空间冲突的问题,我研究了使用 eval 来定义函数。

如果我只能让数据库中的代码定义函数,那么这些函数在任何进程的范围内,并且我们没有全局冲突的可能性。

但是,这似乎不起作用:

我也试过:

所以,总结一下:

  1. 当有进程调用模块时,可以使用 Code.eval 重新定义模块吗?

  2. 是否可以使用 Code.eval 来制作范围绑定到调用 Code.eval 的进程的函数?

  3. 如果你明白我想要做什么,你能建议一个更好的方法吗?

另外,如果有更好的论坛我应该问这个问题,请随时告诉我。如果有我应该阅读的文档或相关示例,请随时向我指出。我不是想让你做所有的工作,我只是自己无法弄清楚。

我正在学习 Elixir 专门用于动态评估代码的能力,但我的 Elixir 知识现在很少——我刚刚开始——而且我的 erlang 也生疏了。

非常感谢!

0 投票
1 回答
20320 浏览

erlang - 如何通过指定模块和方法名称在 Elixir 中动态调用方法?

我想知道长生不老药中的方法名称到底是什么:

但我可以在 erlang 中做几乎相同的事情:

我怎么能在长生不老药中做到这一点?

0 投票
1 回答
420 浏览

erlang - `erl -make` 命令是否可以扩展来执行编译 .erl 文件以外的操作?

我想将 Elixir 集成到我们的项目中,并且好的旧代码不使用rebar,所以我认为编写构建.ex文件的规则Emakefile可能是一个好主意,但是这里的手册页没有提到任何相关内容。

编辑:

我们团队主要是在Windows环境下工作,但是部署会在Linux服务器上完成,所以我需要一个跨平台的解决方案。由于 Erlang 本身是跨平台的,所以我想用erl -make命令来做。

当然我可以写一个Makefile,但是我需要一个build.bat或类似的东西来在我们的开发环境中构建代码,因为我们的开发机器上没有make命令。

有人有更好的主意吗?

更新:

如果有人想知道,我是这样做的:

  1. 将 Elixir 源代码树中的目录复制lib/elixir到我们的源目录,例如some_project/src/tools/elixir.
  2. some_project/src/tools/elixir/src/elixir_transform.erl按顺序将和添加some_project/src/tools/elixir/src/*Emakefile,。将输出目录设置为some_project/ebin(所有其他.beam文件都位于那里)。
  3. src/elixir.app.srcElixir 源代码树复制到some_project/ebin/elixir.app,并对其进行编辑以修复版本代码。
  4. 在dir中运行erl -pa ebin -make,构建 Erlang 代码。some_project
  5. 通过运行构建 Elixir 编译器erl -pa ebin -s elixir_compiler core -s erlang halt
  6. 现在我们的代码中有一个可用的 Elixir 环境,我使用以下 escript 来构建我们的自定义.ex文件:
0 投票
1 回答
333 浏览

erlang - 无法让主管工作

我试图了解 OTP 和 erlang 中的主管(尽管我使用的是 elixir),但我似乎无法弄清楚为什么主主管树不会启动。

我正在用一个监听器工作人员制作一个 http 服务器,一个主管有处理程序(动态启动)。我可以自己启动每一个,如果侦听器是树中唯一的东西,我可以启动树。

这是 Elixir 中的主管定义

树中主管定义的某些内容是错误的,我不知道是什么,而且它似乎基本上是唯一阻碍我的项目的事情。

感谢您的帮助!

0 投票
2 回答
2072 浏览

erlang - 为 erlang 寻找持久的、分布式的工作队列

在重新发明轮子之前,我正在寻找满足这些要求的开源项目的指针。

  • 如果没有太多的包袱(例如:扭曲的依赖迷宫),虽然 go 或 C 是​​可能的,但在 erlang 中实现。
  • erlang 中的端点或客户端(例如:我希望在执行工作时运行 erlang 代码。)
  • 将作业分发到节点,并调用一些 erlang 函数来完成作业。
  • 以某种方式坚持工作
  • 没有主节点,没有单点故障
  • 同构架构
  • 管理可能被备份的作业队列,而不会将作业丢在地上
  • 一项工作不止一次完成是可以的
  • 像 Riak 或 Couchbase 这样的操作配置文件(例如:启动一个节点,然后启动其他节点并将它们指向它。)

强烈偏爱轻量级的东西。erlang 中有很多过度劳累的企业级解决方案,看起来他们需要很长时间才能学习,就像我从头开始重新创建它一样(事实上,我基本上为这个问题构建了一个解决方案来回答某人其他关于stackoverflow的问题。我可以构建我所描述的内容,但这似乎是erlang设计目的中间的需求之一。)

我所考虑的: - ejabbered - 更像是一个消息传递框架 - rabitmq - 理论上是这样做的,但每次我访问他们的网站时,我都会淹没在抽象的海洋中。它似乎准备好做所有事情。我什至无法判断它是否有任何持久性。

编辑添加:这是关于使用储物柜进行分布式锁定的幻灯片。似乎它解决了问题的关键部分(如果有人想自己动手。) http://www.slideshare.net/knutnesheim/locker-distributed-consistent-locking

进一步编辑: 我真的在寻找比 RabbitMQ 更轻量级的东西。我知道它可以做我想做的事,但学习它的成本似乎与我自己做的成本相当,最终定制解决方案将更接近我真正需要的。

0 投票
3 回答
2196 浏览

elixir - 不一致的函数行为

我正在尝试一个square和一个cube功能。为什么squarecube爆炸时工作?

工作正常,而

投掷

0 投票
2 回答
3800 浏览

elixir - iex如何清屏?

irb和许多其他交互式 shell 中,我可以执行Ctrl+L来清除屏幕。

Elixir 的等价物是iex什么?

0 投票
1 回答
173 浏览

erlang - 如何将非事件驱动的流程融入监督树?

我希望能够产生许多处理数据并将它们放入监督树的进程。然而,所有默认行为,即 gen_server、gen_fsm 和 gen_event,都是事件驱动的。他们必须接收消息才能做事。我需要的只是处理数据的进程,如果它们异常终止,它们应该由他们的主管重新启动。这样做的最佳方法是什么?

0 投票
1 回答
1898 浏览

xml - Elixir and Erlang Records Pattern Matching

How to make this kind of record pattern matching in Elixir?

Bonus: rewrite this example from Dave Thomas's blog in Elixir.


Update:

found what was my problem. You have to use

to extract the record from XMerL lib into your program as stated here. Then the .value syntax works and the line can be written as follows:

0 投票
2 回答
8330 浏览

elixir - How to connect two Elixir nodes via local network?

How can I connect two Erlang/Elixir-nodes of two different machines via network connection?