首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

elixir:灵丹妙药?or 徒有其名?

最让人爱不释手的是pipe |>,它让你把一层层的逆着你的思维的函数调用变成了更直观的表现,比如说我们常常这么写代码: IO.puts(tabularize(to_map(Store.get_host(...IO.puts(formatted_output) 这样的代码在Elixir中可以被写成: host |> Store.get_host |> to_map |> tabularize |> IO.puts...老娘/老子在Ruby里,或者在jquery中,经常这么写代码。。。 虽然pipe和chaining表述代码的方式有些类似,但背后的思想不太一样。...见:http://joearms.github.io/2013/05/31/a-week-with-elixir.html 2. Erlang的VM 3....初学者在Erlang的世界里很容易找不到北,这个,走过这段路的人都有感受 4. 这一点,我在meteor下吃了大亏,我的teamspark写于0.5.x,然后每一次版本升级,就各种crash… 5.

1.5K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    (译) Understanding Elixir Macros, Part 2 - Micro Theory

    由于宏也是函数, 而 Elixir 在调用函数时可以省略括号, 所以我们可以这样写: Tracer.trace 1+2 这很可能是 Elixir 之所以不在函数调用时要求括号的最主要原因....宏参数 你要记住, 宏本质上是在扩展阶段被导入的 Elixir 函数, 然后生成最终的 AST. 宏的特别之处在于它所接受的参数都是quoted 的....2] end [a: 1, b: 2] iex(8)> quote do [a: x, b: y] end [a: {:x, [], Elixir}, b: {:y, [], Elixir}] 在第一个例子中...理想情况下, 当我们这样做时, 我们不需要关心输入 AST 的内容, 在我们的例子中, 我们只需要在生成的函数中注入函数体, 而不需要关心函数体中实际有什么. 测试这个宏很简单....使用模块 观察上述代码, 你可以看到 match/2 的胶水代码存在于客户端模块中. 这肯定算不上完美, 因为每个客户端都必须提供对这个函数的正确实现, 而且必须调用 do_match 函数.

    14440

    如何在 IntelliJ 上运行 Elixir 和 Phoenix 程序?

    这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情 Elixir 是一门非常强大的 函数式 编程语言,Elixir 社区构建了一个插件,该插件可以在 Jetbrains 的 IDE...打开 IntelliJ 并点击 New Project,选择创建 Elixir 项目,在 IntelliJ Ultimate 版本中还可以选择数据库。...与 Elixir 项目一样,我们需要先进行运行配置,但是这一次我们要选择 Elixir Mix 因为我们要运行 mix 命令,在配置 mix arguments fields 中输入 phx.server...External Helps Elixir 和 Erlang 插件 创建 Phoenix 项目使用命令 mix phx.new projectName mix deps.get 命令可以安装相关依赖...首先在 lib/phx_quickstart_web/router.ex 文件中增加一个自定义的路由 /zulu,该路由映射到 ZuluController 中的 zulu 函数 接着在 lib/phx_quickstart_web

    1.5K20

    Excel公式技巧17: 使用VLOOKUP函数在多个工作表中查找相匹配的值(2)

    我们给出了基于在多个工作表给定列中匹配单个条件来返回值的解决方案。本文使用与之相同的示例,但是将匹配多个条件,并提供两个解决方案:一个是使用辅助列,另一个不使用辅助列。 下面是3个示例工作表: ?...16:使用VLOOKUP函数在多个工作表中查找相匹配的值(1)》。...解决方案2:不使用辅助列 首先定义两个名称。注意,在定义名称时,将活动单元格放置在工作表Master的第11行。...C:C"),$B11)>0,0) 名称:Arry2 引用位置:=ROW(INDIRECT("1:10"))-1 在单元格C11中的数组公式如下: =INDEX(INDIRECT("'"&INDEX(Sheets...D1:D10 传递到INDEX函数中作为其参数array的值: =INDEX(Sheet3!

    14.1K10

    Elixir和ScyllaDB教你创建CRUD CLI,惊人的效率提升!

    elixir -v好吧,现在我们已经安装好了,我们可以通过在终端模拟器中输入来测试一切是否正常,我们将得到类似于以下内容的响应:Erlang/OTP 25 [erts-13.2.2.2] [source...好了,现在我们已经定义了依赖项,我们可以在终端模拟器中运行它:$ mix deps.get上面的命令将安装我们的mix.exs.伟大的!....env;load()我们使用来自库的函数加载变量Dotenv;我们创建了一个名为的函数start_link,它将负责启动与我们的集群的连接链接;在函数中,我们定义username并password从文件中接收这些值...如果您想了解更多信息,请单击此处以更好地了解 Elixir 如何与模式匹配配合使用。命令好吧,现在是期待已久的时刻:在我们的应用程序中添加负责执行命令的函数!...在同一个存储库中,您也可以使用 Elixir 访问该项目,因此如果您想查看完整的源代码,请知道它位于上面提到的同一链接!

    48830

    (译) Understanding Elixir Macros, Part 1 Basics

    调用 Plug 的 get 和 match 会创建一个函数, 而 ExActor 的 defcall 会生成两个函数和将参数正确从客户端进程传播给服务端进程的代码....基于文件中的数据, 各种函数 (例如 upcase, downcase) 会被生成. 无论是宏还是代码生成, 我们都在编译的过程中对抽象语法树做了某些变换....元编程总是会引入一个隐形 (或不明显)的层, 在 Elixir 中这只发生在编译时, 并独立于程序的各种执行路径....它们只是在描述代码的简单数据, 并没有执行. 这时, 变量 a 和 b 并不存在于当前 Elixir shell 会话 (session)中....实际上, 我们是在把 expression_ast(quoted 1+2)代入到我们生成的片段(fragment)中, 将表达式的结果放入 result 变量.

    19130

    Elixir和OTP中面向过程的编程指南

    在函数式语言中,它可以是函数本身的操作,也可以是由函数传递到函数的不可变数据。...在函数范式中,没有副作用(side effects),这使得问题确定更容易。纯功能系统的挑战是需要“副作用”才能持续保持状态。...Elixir / OTP和面向过程的编程 在Elixir / Erlang和OTP中,通信原语是执行语言的虚拟机的一部分。在进程之间和机器之间通信的能力建立在语言系统的中心。...Elixir或Erlang的任何培训课程必须(通常是)包括OTP,并且应该从一开始就有一个过程方向,而不是“现在你可以在Elixir中编写代码,所以让我们来做并发”类型的方式。...来自UML的Elixir和面向过程的编程的建议是序列图(图2中的例子),以显示进程之间的时间关系,并确定在服务请求过程中涉及哪些过程。

    1.4K10

    思考,问题和方法

    上篇文章 Code is Law,我为 Arcblock 的 github repo 定义的一套规范,就是我自己的思想和方法论的产物 —— 你在任何已有的公开的文档中找不到类似的做法。它完美么?...更可怕的是,这六个函数不仅仅涵盖了 erlang,似乎也可以解释软件领域里的很多系统 —— 它们无所不在,在系统里面的意义就像原力之于星战。 spawn:创建一个资源。...在我们想要做的事情的范畴上来看,如果找不到一个更行之有效的开发方式,我们会开发得很累,且开发进度会比较缓慢。...筹划中,还未开始) 然后在一个 build pipeline 里,生成所有代码。比如生成的 Absinthe 的 query 长这个样子: ?...虽然还有很多问题,但这套系统最大的好处是,在开发过程中,我们可以随意调整 API 的结构而不必每次调整都苦逼修改很多地方的代码。这在我们对很多 API 的行为还没有一个良好定义的时候,是个莫大的福音。

    70200

    (译) Understanding Elixir Macros, Part 6 - In-place Code Generation

    Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir...在 module 中生成代码 正如我在第 1 章中提到的那样, 宏并不是 Elixir 中唯一的元编程机制. 我们也可以在模块中直接生成代码....这允许我们针对某些输入(在本例中是关键字列表)进行元编程, 并生成代码, 而无需编写专门的宏. 注意, 在上面的代码中, 我们如何使用 unquote 将变量注入到函数子句定义中....例如, 在第 2 章中, 我们模拟了 Plug 的 get 宏: defmacro get(route, body) do quote do defp do_match("GET", unquote...问题是我们并没有真正传输 {1,2,3} 三元组. 我们将其注入到目标 AST 中, 注入意味着 {1,2,3} 本身被视为一个 AST 片段, 这显然是错误的.

    18240

    profiling & Flame Graphs

    通过该图,我们可以找到 CPU 占用最多的函数,分析代码热路径。...特征如下: 纵轴:表函数调用栈,上层函数时下层函数的子函数; 横轴:表示 CPU 占用时间,越长表示占用时间越多; 值得注意的是:横轴先后顺序是为了聚合,跟函数间依赖或调用关系无关;一般情况下,火焰图各种颜色是为方便区分...小试一下 Elixir Phoenix Framework & Flame On 根据这篇 Toturial -> Profiling Elixir Applications with Flame Graphs...and Flame On,我们在 Phoenix App Telemetry Dashboard 中集成 Flame On,GET 到如下 Flame Graph: Go && pprof Go 内置了...main.go # 生成 cpu.pprof profiling 文件 # 启动 http server 查看分析数据 go tool pprof -http=:8080 cpu.pprof 然后可以 GET

    18820

    Go 编程 | 连载 11 - 复杂数据类型 Slice

    一、切片 Slice Go 语言数组的长度是不可变的,也就无法数组中添加元素,Go 提供了另一种长度可变的数组,既切片(动态数组),切片可以进行追加元素,相比数组来说更加灵活。...fmt.Printf("%T, %v, %v", jvm_lans, jvm_lans, len(jvm_lans)) } 执行上述代码,输出结果如下: []string, [Scala Groovy], 2...,而 *内存地址 可以获取内存地址指向的实例,append 函数可以对切片进行追加操作,根据输出结果可以确定,初始化时切片的长度为 1,追加一个元素之后切片的长度变为 2。...make 函数和 new 函数都可以定义切片,它们的区别如下: make 和 new 都是用来分配内存的內建函数,且在堆上分配内存,make 即分配内存,也初始化内存;new只是将内存清零,并没有初始化内存...切片是引用类型 数组是值类型,而切片是引用类型,同样可以通过在自定义函数中修改传入的切片类型的数据来验证切片是引用类型。

    49120

    (译) Understanding Elixir Macros, Part 3 - Getting into the AST

    然而, 在 shell 会话中可以很简单地探索和使用 AST, 我通常就是这样探索 AST 结构的....这完全没问题, 因为宏是函数, 这意味着您可以依赖于模式匹配、guards(守卫), 甚至有多子句宏. 在我们的例子中, 我们依靠模式匹配将比较表达式的每一边(被 quoted 的)带入相应的变量....然后, 在 quoted 的代码中, 我们通过分别计算左边和右边重新解释 == 操作(第 4 行和第 5 行), 然后是整个结果(第 7 行)....首先, 在模式匹配中, 硬编码(hard code) :== 被变量 operator 取代了(第 2 行)....因此, 没有这些 guard 语句, 任何双参数的函数调用都会在我们的宏中结束, 这可能是我们不想要的. 使用这个 guard 语句能将输入限制在已知的二进制运算符中. 有趣的事情发生在第 9 行.

    15650

    颠覆者的游戏:程序语言

    90年代中阴差阳错在互联网浪潮中成长起来的java成了一个颠覆者。初期定位在家电产品的java,如果不是赶上互联网第一浪的好时候,早不知道死几回了。...这是语言在发展过程中不断复杂化之后必然的反弹过程 —— 如今,但凡一个支持模版的面向对象的语言,不管有没有类型推定(type interence),代码在抽象和泛化两头撕扯一阵,感觉已经处在六道轮回中,...lisp的诸多思想中,代码即数据,数据即代码,是最具破坏性的。通过 quote,unquote,在代码的语法树上辗转腾挪,你几乎是在以上帝视角来撰写程序。...而elixir的做法和上面商城的例子一样,暴力到令人发指:它打开一个含有所有字符大小写对应关系的unicode.txt,读取其中的信息,在编译时生成几十k个这样的函数: defp do_upcase("...见: http://en.wikipedia.org/wiki/Write_once,_run_anywhere 2. 被盖子欺负的满地找牙的复仇者联盟 3. 原文链接找不到了 4.

    1K80

    继续探索with语句

    在上一篇博客《漂亮的with,鱼与熊掌可以兼得》中,展现了with的优雅之处,然而在比较with与|>时,言犹未尽,讲得不够透彻。...在那篇博客中,我说: 毕竟with/1并不是try/catch,它并不能捕获执行中抛出的错误,然后转向else进行错误处理。只有当模式匹配出现错误时,才会转向else。...要优雅地处理错误,并用优雅的with/1将逻辑串联起来,就需要重构get_user,get_response,send_response等函数。...因为在Elixir中,函数的定义使用了模式匹配,因此,在定义参与|>操作的函数时,可以通过模式匹配来考虑各种情况,这其中可以包含对{:error, error}情形的处理,使得数据流不至于在流经该函数时因为错误而崩溃掉...Joseph Kain在博客Learning Elixir's with给出了一个例子,执行了ecto查询: defp results(conn, search_params) do conn.assigns.current_user

    72670
    领券