宏与函数的区别?(没看懂文档)

#---------
macro hello1()
return :(println(“hello, Macro 1!”))
end
@hello1()
#---------
macro hello2()
return println(“hello, Macro 2!”)
end
@hello2()
#---------
macro hello3()
println(“hello, Macro 3!”)
end
@hello3()
#----------
function hellof()
println(“Hello, Function!”)
end
hellof()

结果:
hello, Macro 1!
hello, Macro 2!
hello, Macro 3!
Hello, Function!

没看见区别

宏是用来做元编程的,是 AST 的函数,也就是用来生成代码的。


前三个宏的区别:

  • 第一个是常用的宏的形式。它展开后返回一个函数调用。也就是返回了那个 println 语句。
  • 第二个、第三个宏等价,因为 julia 默认返回最后一个语句(块)。他们都是在宏展开时执行了语句,并没有返回什么。
julia> macroexpand(Main, :(@hello1))
:((Main.println)("hello, Macro 1!"))

julia> macroexpand(Main, :(@hello2))
hello, Macro 2!

julia> macroexpand(Main, :(@hello3))
hello, Macro 3!

关于第一个和第二三个宏的区别:

宏允许程序员在整个程序运行 生成并包含自定义的代码片段。

—— 注意:为何使用宏?

举得例子也很清楚了,在宏展开时执行的输出,和宏返回语句,然后执行语句得到的输出时不同的。
虽然看起来效果一样。

2 个赞

问题出在语言表述上。“自定义的代码片段”这个词逻辑是混淆的。
代码都是我自己写的啊,没有copy别人的!不会都是宏吧。:smile:

技术文档发生歧义是比较麻烦的

我这么理解,看对不对:

宏主要是用来陈述一段代码的。有点像 windows的批处理文件。

你可以先从clojure入门,在clojure编程实战155页的unless宏可以帮助你更好理解宏
宏可以拿来更改语法规则,像lisp只用了8个关键字,通过宏构成出了整个语言

越说越复杂了:blush:

宏可以看作参数和返回值都是代码的函数 f(::Expr...)->Expr
执行宏,相当于 eval(f(expr...))

1 个赞

文档介绍一个概念,本应该尽可能言简意赅地表达核心思想。
至少,到目前的其它解释,都没有<宏主要是用来陈述一段代码> 这句话表达得清楚。

至少,到目前的其它解释,都没有<宏主要是用来陈述一段代码> 这句话表达得清楚。

本身你的理解是错的。如果你不需要元编程,你不需要自己写宏。

宏是用以"按设定模板生成具体代码"的程序结构体。如何?

如果懂一点编译原理,“宏是 AST 的函数” 我觉得这句就是最精确的了。

这也是宏的一种常用用法,不过并不是全部。

宏也可以对当作参数传入的语句(块)进行修改。

“函数”,嘛,不一定要有参数的,参数也可以是函数,宏也一样。


我又想了下,你说的这句也挺对的,得看你对“模板”的定义是什么了。
以模式匹配的方式使用宏也是一种常用的方法,类似你说的模板。
换句话说函数也是按照“模板”生成具体的值(纯函数的意义上,类似 haskell 定义函数的方式)

一些模式匹配的例子

1 个赞