gpt4 book ai didi

metaprogramming - 以编程方式更改 Elixir 代码

转载 作者:行者123 更新时间:2023-12-04 07:10:44 25 4
gpt4 key购买 nike

我需要在 mix.exs 文件中加载、更改和编写代码。我希望能够加载文件,编写依赖项并编写文件。

我开始:

defmodule Elixir_2ndTest.Mixfile do
use Mix.Project

def project do
[app: :elixir_2nd_test,
version: "0.0.1",
elixir: "~> 1.2",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
description: description(),
deps: deps]
end

def application do
[applications: [:logger]]
end

defp deps do
[]
end
end

最后我需要得到(唯一的区别在于 deps 的乐趣):
defmodule Elixir_2ndTest.Mixfile do
use Mix.Project

def project do
[app: :elixir_2nd_test,
version: "0.0.1",
elixir: "~> 1.2",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
description: description(),
deps: deps]
end

def application do
[applications: [:logger]]
end

defp deps do
[{:httpoison, "~> 0.8.3"}]
end
end

依赖项来自不同的构建系统(我不能直接从公共(public)互联网使用十六进制,所以我在离线模式下使用它并将依赖项放在 .hex/

我知道将它们插入到 deps 函数中需要哪些依赖项和哪些版本(在本例中为 httpoison 0.8.3)。

如果我的理解是正确的,这应该可以通过加载文件、引用、更改、取消引用来实现。

这是我到目前为止所拥有的:
{:ok, body} = File.read("mix.exs")
{:ok, ast} = Code.string_to_quoted(body)

任何关于如何更改 ast 并将其写回的指针将不胜感激。

最佳答案

它看起来并不完全相同,但您可以使用 Macro.to_string将 ast 转换回 Elixir 代码。

我在玩我的图书馆 PhStTransform修改 ast 并将其转换回代码。这是来自 PhStTransform 测试库的一个非常简单的示例。

test "transform quote do output" do
data = quote do: Enum.map(1..3, fn(x) -> x*x end)
data_transform = quote do: Enum.map(1..3, fn(y) -> y*y end)
replace_x = fn(a, _d ) ->
case a do
:x -> :y
atom -> atom
end
end
potion = %{ Atom => replace_x }
assert PhStTransform.transform(data, potion) == data_transform
end

这样做是将所有对 :x 的引用转换为 :y。为 PhStTransform 编写药水需要更聪明一些,但我认为这应该是可能的。 PhStTransform 是 hex.pm。

https://hex.pm/packages/phst_transform

关于metaprogramming - 以编程方式更改 Elixir 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38153800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com