問題タブ [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.
dynamic - Elixir または Erlang で実行時に動的にモジュールを作成してロードするにはどうすればよいですか?
基本的なシナリオは次のとおりです。データベースからテキストをロードし、そのテキストを Elixir モジュール (または Erlang モジュール) に変換して呼び出しを行う必要があります。テキストは実質的にモジュール ファイルと同じです。したがって、これはホット コード ロードの一種です。「ファイル」をコンパイルしてから、結果のモジュールをロードし、それを呼び出します。後で荷降ろしします。唯一の違いは、コードがディスク上のファイルではなくデータベースに存在することです。(そして、それをロードするコードを書いている時点では存在しません。)
Erlang がホット コード ロードをサポートしていることは知っていますが、ディスク上のファイルをコンパイルしてからビームをロードすることに重点を置いているようです。これをより動的なプロセスとして実行したいと考えており、実行中のコードを置き換えるのではなく、コードをロードしてから実行し、アンロードします。
Elixir には、実行時にコードを評価するための機能がいくつかあります。私はそれらでこれを行う方法を理解しようとしていますが、ドキュメントは少しまばらです。
「最初の要素がモジュール名で、2 番目の要素がそのバイナリであるタプルのリストを返します」。これで、モジュール名とそのバイナリを取得できましたが、バイナリをランタイムにロードして呼び出す方法がわかりません。どうすればいいですか?(私が見ることができるコードライブラリにはそのための機能はありません。)
おそらく、Erlang 関数を使用できます。
わかりました、これはアトム「モジュール」とモジュールのタプルを返します。データベースからロードされた文字列が「Paris」というモジュールを定義した場合、コードでどのように実行しますか
parisというモジュールがあることを前もって知らないので?文字列「paris」もデータベースに保存することで、これが名前であることを知ることができましたが、呼び出しているモジュールの名前として文字列を使用して、モジュールを呼び出す方法はありますか?
もあります:
文字列の内容を評価します。この文字列をモジュールの定義全体にすることはできますか? そうではないようです。相互に呼び出す複数の関数を持つような方法で評価されるこのコードを記述できるようにしたいと考えています。たとえば、事前定義されたエントリ ポイント (メインなどの「DynamicModule.handle([パラメータ, リスト])」として
次に、EEx モジュールがあります。これには次のものがあります。
これは、テンプレートを作成するのに最適です。しかし、最終的には、文字列があり、Elixir コードが埋め込まれているユースケースでのみ機能するようです。オプションのコンテキストで文字列を評価し、文字列を生成します。文字列を、呼び出し可能な 1 つ以上の関数にコンパイルしようとしています。(問題のない関数を 1 つだけ作成できる場合、その関数はパターン マッチするか、必要な他のことを行うように切り替えることができます....)
これが型にはまらないことはわかっていますが、このようにする理由があり、それらは良いものです。これを行う方法についてアドバイスを探していますが、「そうしないでください」と言われる必要はありません。Erlang はホット コード ロードをサポートし、Elixir は非常に動的ですが、構文や適切な関数がわかりません。私はこの質問を注意深く監視します。前もって感謝します!
最初の回答に基づく編集:
答えてくれてありがとう、これは良い進歩です。Yuri が示したように、eval はモジュールを定義できます。また、José が指摘するように、コード eval はバインディングを含むコードの小さな部分に使用できます。
評価されるコードは (モジュールに変換されるかどうかにかかわらず) かなり複雑になります。そして、その開発は、それを関数に分解し、それらの関数を呼び出すことを含むのが最善です.
参考までに、いくつかのコンテキストを提供させてください。Web フレームワークを構築しているとします。データベースからロードされたコードは、特定の URI のハンドラーです。したがって、HTTP 呼び出しが着信すると、example.com/blog/ のコードをロードすることがあります。このページには、コメント、最近の投稿のリストなど、いくつかの異なる内容が含まれる場合があります。
多くの人が同時にページにアクセスしているため、各ページ ビューを処理するプロセスを生成しています。したがって、異なる要求に対して、このコードが同時に評価される場合が多くあります。
モジュール ソリューションを使用すると、コードをページのさまざまな部分 (例: 投稿、コメントのリストなど) の関数に分割できます。また、起動時にモジュールを 1 回ロードし、それを呼び出す多くのプロセスを生成します。それに。モジュールはグローバルですよね?
モジュールが既に定義されている場合はどうなりますか? EG: モジュールが変更され、そのモジュールを既に呼び出しているプロセスがある場合。
iex では、既に定義されているモジュールを再定義できます。
そのモジュールを現在呼び出しているすべてのプロセスに対して、実行時にモジュールを再定義するとどうなりますか? また、この再定義は iex 以外の通常の操作で機能しますか?
モジュールの再定義には問題があり、モジュールがグローバルであると名前空間の衝突で問題が発生する可能性があると想定して、関数を定義するために eval を使用することを検討しました。
データベースからのコードで関数を定義するだけでよい場合、それらの関数はどのようなプロセスのスコープ内にもあり、グローバルな衝突の可能性はありません。
ただし、これは機能しないようです。
私も試しました:
つまり、要約すると:
モジュールを呼び出すプロセスがある場合、Code.eval を使用してモジュールを再定義できますか?
Code.eval を使用して、Code.eval が呼び出されたプロセスにスコープがバインドされた関数を作成することはできますか?
私がやろうとしていることを理解できたら、より良い方法を提案してもらえますか?
また、私がこれを尋ねるべきであるより良いフォーラムがあれば、遠慮なく私に知らせてください. また、読むべきドキュメントや関連する例があれば、遠慮なくそれらを教えてください。私はあなたにすべての仕事をさせようとしているわけではなく、自分でそれを理解することができません.
特にコードを動的に評価する機能のために Elixir を学んでいますが、Elixir の知識は今では最小限です。
どうもありがとう!
erlang - モジュール名とメソッド名の両方を指定して、Elixirでメソッドを動的に呼び出す方法は?
Elixirのメソッド名が正確に何であるかを知りたい:
しかし、erlang でもほぼ同じことができます。
エリクサーでこれを行うにはどうすればよいですか?
erlang - `erl -make` コマンドを拡張して、.erl ファイルのコンパイル以外のことを行うことはできますか?
rebar
Elixir.ex
を私たちのプロジェクトに統合したかったのですが、古き良きコードEmakefile
では.
編集:
私たちのチームは主に Windows 環境で作業していますが、デプロイは Linux サーバーで行うため、クロスプラットフォーム ソリューションが必要です。erl -make
Erlang自体がクロスプラットフォームなので、コマンドでやりたかった。
もちろん、 を書くことはできますが、開発マシンにはコマンドがないため、開発環境でコードをビルドするには やそれに似たものMakefile
が必要になります。build.bat
make
誰でも良いアイデアがありますか?
アップデート:
誰かが知りたい場合のために、私はこのようにしています:
lib/elixir
Elixir ソース ツリーのディレクトリをソース ディレクトリにコピーしますsome_project/src/tools/elixir
。- 、 に、 をこの順序で追加
some_project/src/tools/elixir/src/elixir_transform.erl
します。出力ディレクトリを(他のすべてのファイルはそこにあります) に設定します。some_project/src/tools/elixir/src/*
Emakefile
some_project/ebin
.beam
src/elixir.app.src
Elixir ソース ツリーを にコピーしsome_project/ebin/elixir.app
、編集してバージョン コードを修正します。- dir
erl -pa ebin -make
で , を実行して、Erlang コードをビルドします。some_project
- を実行して Elixir コンパイラをビルドします。
erl -pa ebin -s elixir_compiler core -s erlang halt
- これで、コードに動作する Elixir 環境ができました。次の escript を使用してカスタム
.ex
ファイルを作成します。
erlang - スーパーバイザーを働かせることができない
erlangのOTPなどのスーパーバイザーに頭を悩ませようとしていますが(エリクサーを使用していますが)、メインのスーパーバイザーツリーが起動しない理由がわかりません。
私は1人のリスナーワーカーでhttpサーバーを作成しており、スーパーバイザーにはハンドラーがあります(動的に開始されます)。私はこれらのそれぞれを自分で開始することができ、リスナーがツリー内の唯一のものである場合はツリーを開始することができます。
これがエリクサーのスーパーバイザーの定義です
ツリー内のスーパーバイザーの定義に関する何かが間違っていて、何がわからないのか、そして基本的にそれが私のプロジェクトを妨げている唯一のことのようです。
助けてくれてありがとう!
erlang - erlang の永続的で分散されたワーカー キューを探しています
車輪を再発明する前に、これらの要件を満たすオープン ソース プロジェクトへのポインタを探しています。
- 荷物が多すぎない場合は、go または C が可能ですが、erlang で実装されます (例: 依存関係のねじれた迷路)。
- erlang のエンドポイントまたはクライアント (例: 仕事をするときに erlang コードを実行したい。)
- ジョブをノードに分散し、いくつかの erlang 関数を呼び出してジョブを実行します。
- 何とかして仕事を続ける
- マスターノードなし、単一障害点なし
- 同種のアーキテクチャ
- ジョブを床に落とさずに、バックアップされる可能性のあるジョブのキューを管理する
- 複数回実行されるジョブは問題ありません
- Riak や Couchbase などの運用プロファイル (例: 1 つのノードを開始し、次に他のノードを開始して、それらをそのノードに向ける)
軽いものを好む傾向が強い。erlang には、やり過ぎたエンタープライズ レベルのソリューションがたくさんありますが、これをゼロから再作成するのと同じくらい習得するのに時間がかかるようです (実際、私は基本的に、誰かへの回答として、まさにこの問題に対するソリューションを設計しました。ここでスタックオーバーフローに関するelseの質問.私が説明したものを構築することはできますが、これはerlangが設計されたものの真ん中にあるニーズの1つのようです.)
私が考えたこと: - ejabbered - より多くのメッセージング フレームワーク - rabitmq - 理論的にはこれを行いますが、彼らの Web サイトにアクセスするたびに、抽象化の海に溺れます。すべてを行う準備ができているようです。永続性があるかどうかさえわかりません。
編集して追加:これは、ロッカーを使用した分散ロックに関するスライド デッキです。問題の重要な部分を解決するようです(自分でロールバックしたい場合) http://www.slideshare.net/knutnesheim/locker-distributed-consistent-locking
さらに編集: RabbitMQ よりも軽量なものを本当に探しています。自分のやりたいことができることはわかっていますが、それを学習するコストは、自分でそれを行うコストに匹敵するように思えます。最終的には、カスタム ソリューションが本当に必要なものに近くなります。
elixir - 一貫性のない関数の動作
square
と関数を試していcube
ます。爆破square
中に動作するのはなぜですか?cube
正常に動作します
スロー
elixir - ローカルネットワーク経由で 2 つの Elixir ノードを接続するには?
ネットワーク接続を介して、2 つの異なるマシンの 2 つの Erlang/Elixir ノードを接続するにはどうすればよいですか?