#CS #PLT 入门级别的回答们 #CoolShell
+ 也不要太较真成『语法糖主义』…
也不要太较真成『语法糖主义』… Java 5 之前没 Generics 的时候代码不还是照样写、Assembler 那时没有 C 不还是可以编程,C 从 89 到 17 加了多少特性,vararg、complex、block、pack,多少也是『可有可无』的,甚至因为有内联汇编和底层访问性、低层次的规范,你都可以内联汇编给它“加特性”,你甚至可以说,C 就是汇编的语法糖,哪怕它让代码机器平台无关、提供了类型检查
C++ 的 block 的确是没啥革命性的变更,但是一切皆语法糖这个观点太表面了…
+ 另外你所说的 environment 模型是指 Scheme 系基于 Lambda 演算程序设计语言的 Lexical scoping 变量解析吗?
另外你所说的 environment 模型是指 Scheme 系基于 Lambda 演算程序设计语言的 Lexical scoping 变量解析吗?
Lisp 里这样的… 我还是用 Racket 吧(我不会 R*RS,但多范式融合的也就是那个样子),怎么说,Lisp 首先这个语言本身已经很老了并且也对很多人不那么可获取、其次它的名称被滥用的很严重,有一大堆 『Lisp 方言』 和 『C-like 语言』了…. 我…..
+ First-class 在 PLT(Programing Language Theory)里是指『能够被作为“子程序”的参数、返回值』使 用的一种『值』。
First-class 在 PLT(Programing Language Theory)里是指『能够被作为“子程序”的参数、返回值』使用的一种『值』。
C 里面有函数指针、但一些语言(很难举出例子… 因为又要有子程序又不能有函数指针,我举 Bash 吧)就不存在『函数指针』
同样的,一些语言里没有『变量』而只有『等式』『定义』『侧面』『式子(Term)』这些与之类似的概念,可能在使用上也有相通并且经常被弄混,但把他们混为一谈偏偏就是不准确的
何况〖变量化函数〗这个名称本身也有点不准确 — 是不是说函数就不能被作为参数和返回值呢?虽然很多语言都在低层使用了本地变量来管理参数的状态分配,是不是就意味着子程序的『参数』和『返回值』都是『变量』呢?
而且函数式里说的这个『first-class functions』远远不止一个 functions,还有它依赖的 data,这是一个容易被忽视的侧面。
有的时候我们就是需要一个可以进行『操作』的『值』而已,不需要关心它们是来自『变量』还是『参数』、他们是不是一个『函数变量』。
这个特性就是 1932 年 Lambda calculus 的 lexical scoping,这里 讲的很清楚
任何新知识对任何人来说都是突兀的,所以我们在第一次见到某种概念的时候应该学会闭嘴。我第一次听王垠骂 Type Theory Hindley-Milner 类型推导和 Haskell 的惰性计算引用透明的时候也无脑跟着骂了(那时候是一行 Haskell 都没有看过….)…. 现在是极其后悔 为什么要无脑跟风(给一点建议…)
和变量这个东西有『相通』(都能用)之处,但还是很不一样的。
就像上面那个拿『引用透明』换『确定性』(这个还有和线程安全的某种特例混淆的风险)的人一样,能够准确的就尽可能做到准确,这不正是酷壳大部分技术文和科普/人文写作的风格吗?有多少技术博客还会专门列个引用表给人去找上面的一手资料…
+ 未必啊,我们只是使用了接口,没有规定必须得怎样实现
未必啊,我们只是使用了接口,没有规定必须得怎样实现
for/while 是经典顺序逻辑编程里常用的循环,但实际上计算远远不止这一种可能,有复杂的数据库查询可以分到很多台计算机上去做、复杂的 ray tracing 渲染可以分到计算集群去做,单机对于 DIP 处理/计算机视觉/3D 计算/着色 什么的,未必就 for/while 这一种,比如 X86 的 SIMD 特性(SSE/AVX 什么的)就可以让你一下子处理一批数据,批量完成加减乘除取余什么的,这种情况 map 的语义远远比 for index 好,编译器也更敢做优化一些
+ 也不要太较真成『语法糖主义』…
也不要太较真成『语法糖主义』… Java 5 之前没 Generics 的时候代码不还是照样写、Assembler 那时没有 C 不还是可以编程,C 从 89 到 17 加了多少特性,vararg、complex、block、pack,多少也是『可有可无』的,甚至因为有内联汇编和底层访问性、低层次的规范,你都可以内联汇编给它“加特性”,你甚至可以说,C 就是汇编的语法糖,哪怕它让代码机器平台无关、提供了类型检查
C++ 的 block 的确是没啥革命性的变更,但是一切皆语法糖这个观点太表面了…
+ 另外你所说的 environment 模型是指 Scheme 系基于 Lambda 演算程序设计语言的 Lexical scoping 变量解析吗?
另外你所说的 environment 模型是指 Scheme 系基于 Lambda 演算程序设计语言的 Lexical scoping 变量解析吗?
Lisp 里这样的… 我还是用 Racket 吧(我不会 R*RS,但多范式融合的也就是那个样子),怎么说,Lisp 首先这个语言本身已经很老了并且也对很多人不那么可获取、其次它的名称被滥用的很严重,有一大堆 『Lisp 方言』 和 『C-like 语言』了…. 我…..
(define counter可是要用到副作用啊… 什么是消息传递模型,大概就是类似面向对象 Builder pattern 那个数据依赖构建吧,一般都是高阶函数引用 UpValue… 并且传递的消息,一般都是 immutable 的数据模型对象啊?
(lambda [n] (+ n 1))) ; your definition above
(define effect-couter
(lambda [n] [lambda [] (set! n (+ n 1)) n])) ; using side-effects upvalue assignment like what we does in JavaScipt
(define time-a (effect-counter 0))
(display (a)) ; 1
(display (a)) ; 2
+ First-class 在 PLT(Programing Language Theory)里是指『能够被作为“子程序”的参数、返回值』使 用的一种『值』。
First-class 在 PLT(Programing Language Theory)里是指『能够被作为“子程序”的参数、返回值』使用的一种『值』。
C 里面有函数指针、但一些语言(很难举出例子… 因为又要有子程序又不能有函数指针,我举 Bash 吧)就不存在『函数指针』
同样的,一些语言里没有『变量』而只有『等式』『定义』『侧面』『式子(Term)』这些与之类似的概念,可能在使用上也有相通并且经常被弄混,但把他们混为一谈偏偏就是不准确的
何况〖变量化函数〗这个名称本身也有点不准确 — 是不是说函数就不能被作为参数和返回值呢?虽然很多语言都在低层使用了本地变量来管理参数的状态分配,是不是就意味着子程序的『参数』和『返回值』都是『变量』呢?
而且函数式里说的这个『first-class functions』远远不止一个 functions,还有它依赖的 data,这是一个容易被忽视的侧面。
function konst(x) {
return function immediate() { return x; }; }
let a = konst(1);
console.log(a()) // 1
如果真的只有一个『函数指针』,那这个 x 变量应该从哪里来?所以对于好的程序员,闭包和匿名函数不应混淆,哪怕是概念都应该尽可能做到准确无歧义。有的时候我们就是需要一个可以进行『操作』的『值』而已,不需要关心它们是来自『变量』还是『参数』、他们是不是一个『函数变量』。
这个特性就是 1932 年 Lambda calculus 的 lexical scoping,这里 讲的很清楚
任何新知识对任何人来说都是突兀的,所以我们在第一次见到某种概念的时候应该学会闭嘴。我第一次听王垠骂 Type Theory Hindley-Milner 类型推导和 Haskell 的惰性计算引用透明的时候也无脑跟着骂了(那时候是一行 Haskell 都没有看过….)…. 现在是极其后悔 为什么要无脑跟风(给一点建议…)
和变量这个东西有『相通』(都能用)之处,但还是很不一样的。
就像上面那个拿『引用透明』换『确定性』(这个还有和线程安全的某种特例混淆的风险)的人一样,能够准确的就尽可能做到准确,这不正是酷壳大部分技术文和科普/人文写作的风格吗?有多少技术博客还会专门列个引用表给人去找上面的一手资料…
+ 未必啊,我们只是使用了接口,没有规定必须得怎样实现
未必啊,我们只是使用了接口,没有规定必须得怎样实现
for/while 是经典顺序逻辑编程里常用的循环,但实际上计算远远不止这一种可能,有复杂的数据库查询可以分到很多台计算机上去做、复杂的 ray tracing 渲染可以分到计算集群去做,单机对于 DIP 处理/计算机视觉/3D 计算/着色 什么的,未必就 for/while 这一种,比如 X86 的 SIMD 特性(SSE/AVX 什么的)就可以让你一下子处理一批数据,批量完成加减乘除取余什么的,这种情况 map 的语义远远比 for index 好,编译器也更敢做优化一些
酷 壳 - CoolShell
C/C++语言中闭包的探究及比较 | | 酷 壳 - CoolShell
(感谢投稿人 @思禽饮霜 ) 这里主要讨论的是C语言的扩展特性block。该特性是Apple为C、C++、Objective-C增加的扩展,让这些语言可以用类Lambda表达式的语法来创建闭包。前段时间,在对CoreData存取进行封装时(让开发人员可以更简洁快速地写相关代码),我对block机制有了进一步了解,觉得可以和C++ 11中的Lambda表达式相互印证,所以最近重新做了下整理,分享给大
Forwarded from Math notes | 数学笔记 (Harry Ying)
reasoning-about-knowledge-part-1.pdf
283.3 KB
PDF版本
PDF Version
PDF Version
#Math 今天上午的数学笔记(以后可能按周更新)
上午看了人教《高中数学 必修 5》,解三角形的前几面,入门了一点 naive 的数学等式分析能力。
首先,是要从一个三角形函数的定义 推出三角形里边长之间的关系,有一个式子:
Rt triangle ABC:
(a / sin A) = (b / sin B) = c
where sin 角 = 斜边 / 对边
且 C=1 的时候... 忘了,之后是推广到了锐角三角形上,作了个边 CD 垂直居中边 CB 然后利用 sin 的性质 sin A = {三角形CDB CB 边上的高}
然后我几何数学推导(是的,之前我只知计算... 套用模板的)的也是第一次看,就没有考虑到那方面的东西
我就有一个问题:为什么它说
甚至我知道它是指
首先当然是万能(划掉)的列举法,算法设计的时候一个强有力(迫真)的思路
泛化成等式
之前我还迫真变形一次,结果在上面那个三等式子里消除了第二个等号(除法消除因子变换)... 我把 c 跨等号约掉了(所以我觉得很奇怪,为什么项和一个等号直接消失了),即使不知道做了什么 😂
(补充,是看错了,其实式子是
这时候我才想到:啊! (b / a) 问的不是 『b 里面有几个 a』 么? 所以问 『a 里面有几个『b 里面有的 a』』难道不是 b 么?
还是好奇怪啊...
👆上面的补充,修改之后(你看上面那个结论还是令人困惑,因为它的确是错的)
这时候我才想到:(a / b) 问的不是 『a 里面有几个 b』 么? 所以问 『a 里面有几个『a 里面有的 b』』难道不是 b 么?
上午看了人教《高中数学 必修 5》,解三角形的前几面,入门了一点 naive 的数学等式分析能力。
首先,是要从一个三角形函数的定义 推出三角形里边长之间的关系,有一个式子:
Rt triangle ABC:
(a / sin A) = (b / sin B) = c
where sin 角 = 斜边 / 对边
且 C=1 的时候... 忘了,之后是推广到了锐角三角形上,作了个边 CD 垂直居中边 CB 然后利用 sin 的性质 sin A = {三角形CDB CB 边上的高}
然后我几何数学推导(是的,之前我只知计算... 套用模板的)的也是第一次看,就没有考虑到那方面的东西
我就有一个问题:为什么它说
(a / sin A) aka. (a / (c / a)) 这个是正确的(是的,对你们就是 immediate 的)甚至我知道它是指
(a / sin A) = c 都想了半天(开始我怀疑是利用了相等的传递性,可是就不知道是把两个子式 =c 传递过去了...);然后我就想,为什么是 = c 呢?首先当然是万能(划掉)的列举法,算法设计的时候一个强有力(迫真)的思路
泛化成等式
a / (b / a) = b (之前搞错成 b / a / a 了....),我考虑了 a=1 b=10; a=3 b=15 的情况,第二个 case 失败了之前我还迫真变形一次,结果在上面那个三等式子里消除了第二个等号(除法消除因子变换)... 我把 c 跨等号约掉了(所以我觉得很奇怪,为什么项和一个等号直接消失了),即使不知道做了什么 😂
(补充,是看错了,其实式子是
a / (a / b) = b.... 还是很奇怪这时候我才想到:啊! (b / a) 问的不是 『b 里面有几个 a』 么? 所以问 『a 里面有几个『b 里面有的 a』』难道不是 b 么?
还是好奇怪啊...
👆上面的补充,修改之后(你看上面那个结论还是令人困惑,因为它的确是错的)
这时候我才想到:(a / b) 问的不是 『a 里面有几个 b』 么? 所以问 『a 里面有几个『a 里面有的 b』』难道不是 b 么?