写了多年程序,突然想知道为什么函数可以连着用啊

2018-09-12 11:56:54 +08:00
 pinews
就是 a(b(c()))这样,虽然经常这样用,总觉得怪怪的,不知道在哪里是否有专门的说明?
15310 次点击
所在节点    PHP
148 条回复
est
2018-09-12 11:57:46 +08:00
咖喱化(科里化)?
javaWeber
2018-09-12 12:00:06 +08:00
从内向外,函数返回的结果,作为参数使用呗。。
deston
2018-09-12 12:02:59 +08:00
2 楼上说的很清楚了,我来看看楼下怎么说
zn
2018-09-12 12:06:46 +08:00
函数调用得到的就是一个值,跟一个普通的 1 在本质上没什么区别,都是堆栈上的一个条目而已。
Fairy1128
2018-09-12 12:06:55 +08:00
函数的结果作为参数传递给另一个函数 很正常啊 又不是 callback 更谈不上柯里化
lnim
2018-09-12 12:08:24 +08:00
二楼说的很明白了 只要函数有返回值 就都可以这样写啊 而且在函数范式的语言中 函数也能直接当参数使用~
marcong95
2018-09-12 12:09:14 +08:00
数学课本?函数这样用不是理所当然的么?复合函数了解一下?
kerr92
2018-09-12 12:10:43 +08:00
这种一点也不奇怪吧…… JS 里的 c().b().a()都很正常
mengzhuo
2018-09-12 12:13:12 +08:00
基础知识啊~

Go 的话,这是栈(call stack)的作用,不考虑 inline,SSA 这些东西,大概过程是这样的(中文翻译可能不准确)

语法检查器发现语法 a(b(c())), 校验合格之后,告诉 tokenizer,处理一下。

tokenizer 把这个拆成( parse )语法树( AST )
a() --
|- b()
|- c()

然后告诉编译器,处理一下。

编译器找到语法树叶子节点,反向查找得到执行树 c->b->a,然后依次写机器码

伪内存地址 0x00001:func c() ... 跳转到 b()

伪内存地址 0xff002: func b() ... 跳转到 a()

伪内存地址 0xf1113: func a()

保存可执行文件退出。
cuzfinal
2018-09-12 12:15:11 +08:00
想了解程序的运行?
❌:查阅编译原理等相关书籍
⭕️:上论坛发帖询问
puga2006
2018-09-12 12:15:18 +08:00
这个不是最基础的函数编程思想么,我感觉楼主的疑惑倒是怪怪的🤔
littleylv
2018-09-12 12:16:33 +08:00
不觉得楼主像是“写了多年程序”的样子
arthasgxy
2018-09-12 12:17:46 +08:00
y=x+1
z=y+1
w=z+1

w=((x+1)+1)+1

如果这样看起来不感觉奇怪的话。
你把它写成函数也不会觉得奇怪吧。。。
imn1
2018-09-12 12:17:57 +08:00
区块链……
tumi9527
2018-09-12 12:18:40 +08:00
php 匿名函数了解一下
marsgt
2018-09-12 12:20:54 +08:00
其实就是数学上把一组复杂函数抽象成单个量的思想,可以去看看《代码之髓》这类的书
watzds
2018-09-12 12:21:31 +08:00
函数式编程只能这样写
irainsoft
2018-09-12 12:22:11 +08:00
f(g(x))也奇怪吗
HXM
2018-09-12 12:22:14 +08:00
复合函数
ssynhtn
2018-09-12 12:22:39 +08:00
斯坦福公开课 CS110 了解一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/488475

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX