duangsuse::Echo
714 subscribers
4.24K photos
127 videos
583 files
6.46K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
#py 周刊 - 周刊1 无语了, #telegram 上写文怎么破事那么多呢? Ctrl+K 弹框又限bot干🐴呢,哇会做C++ UX真是太厉害了,Markdown编辑都搞不全 //替换/^\d*、//g; $0.innerHTML.replace(/<.?p.*?>/g,"") $$('p').forEach(e=> e.replaceWith(...e.childNodes)) $('[tabindex]:read-write').innerHTML=prompt() 只能在vs和web两个浏览器间,直接CtrlCV文档…
#py 周刊
周刊1
#新品
Black 格式化工具+lint的替代者Ruff:快 30 倍以上 25w/.1s
你应该什么时候升级到 Python 3.12?建议你等到 12 月,修复不兼容的软件包、缺少二进制包

Python 3.12:一个被人忽略的史诗级版本 👍
改进 Numpy 的 Python API,为 2.0 版本准备

3.12 对于 Python 的意义,大于 3.5 的“async/await” 和 3.6 的 “Type Hint” 对于 Python 的意义!PEP-669 带来的可调试性(Cyberbrain call #visualize)、PEP-684 为 non-GIL 带来的性能提升、PEP-697 松耦合 C API


不要再用 requirements.txt 了, setup.py 的糟糕体验
推荐使用 Poetry。pip 的主要问题是没有 lockfile 和手工管理虚拟环境麻烦
在 Mac 上安装 Python 的正确方法作者给出的建议是 Pyenv + pyenv-virtualenv

uDjango:单文件的 Django 微型项目 这个项目是 DjangoCon US 2023 的演示项目,使用单文件不到 10 行代码,演示一个最小的 Django 应用。
Django vs Flask:哪个是最好的 Python Web 框架?一篇细致的长文,详细对比了它们在模板系统、URL 调度器、数据库支持、身份验证及授权、测试、软件架构、学习曲线等方面的差异。没有更好的,只有是否适合你的。

从零开始编写一个 Python 异步 ASGI Web 框架 这篇循序渐进的教程是很好的学习材料,让你了解 Web 框架设计、异步编程
kivy+pandas 开发简单的 Android 数据分析应用其作用是记录和显示你全天在屏幕上花费的时间

#框架
为什么 Django 后台管理系统那么“丑陋”?Django Admin UI 很多年没有变化,显得设计过时了。因为它不应该暴露给终端用户。

数据库生成的列 :Django & SQLiteGeneratedField 是正在开发的 Django 5.0 的新功能,实现C=A+B等自动SQL算式。这篇文章还介绍了一些 Django 5.0 中的新东西
Kenneth Reitz:迟来的道歉,以及 requests 3 的进展2019 年时 requests 3 的筹款闹出了不小的风波!文中列举了目前已经完成的一些事情(typehint,imports,async)

esmerald:高度可扩展、高性能的 Web 框架基于 Starlette 和 Pydantic ,支持同步和异步,提供 DAO、ORM、ODM、依赖注入、权限管理等功能。
grequests:异步的 HTTP 请求grequests 构建在 gevent 库之上,一个提升性能的建议。

#技巧 😨
100%的测试覆盖率是不够的:Python 中基于命题的测试 如何设置 @pytest.mark.parametrize
Hypothesis

Python 如何在日志中隐藏明文密码? 基于 logging 模块的两种实现方案:自定义 filter 和自定义 formatter
使用 AI 进行网页抓取实验(使用 GPT-4 解析 HTML)GPT4的能力到底如何呢?如抓取结构良好的网站、抓取 Google 自然搜索结果、抓取 Google SERP、以及抓取 Google MAPS 结果。

从混沌到凝聚:构建你自己的 Monorepo 文章介绍如何使用 GitHub Actions。monorepo 是将所有项目都放到一个代码仓管理,可能包含不同语言和框架。这意味着对它的依赖管理和 CI/CD 等都与普通代码仓不同。
RSS-GPT:使用 ChatGPT 为你的 RSS 订阅源生成摘要使用 GitHub workflow 新生成 RSS 订阅源且推送到 GitHub Pages。一键配置无需服务器。


#精通
Python 是一种编译型语言

我们通常习惯将 Python 称为一种解释型语言,因为它在运行时逐行。很多人还知道 .pyc 其实也有编译的过程。作者通过苏格拉底式对话和几轮实验,引导读者重新思考“解释”与“编译”:它们是错误的二分法、限制了编程的可能性
Python-Type-Challenges:通过在线挑战来学习 Python 类型提示

开发一个 Python 编译器和解释器这是一系列博文,目前已更新 6 篇,目标是探索和研究实现 Python 等编程语言所需的概念和算法,将会涉及:Lex-YaCC、树解释器。

你能用 Python 的 bisect 模块做到这些事两个函数,可以做很多事:二分搜索、前缀搜索、在列表中查找连续的相等值、查找字典中最接近的键、自定义对象的排序、按照字典 key 搜索。
使用 Ptpython 提高你的编码效率Ptpython 是一个功能丰富且对用户友好的 Python REPL,在脚本中嵌入。
de4py:Python 逆向工程工具包 (neta de4dot) 一款高级的 Python 反混淆器,面向恶意软件分析师和逆向工程师,它拥有精美的 UI 和一些高级功能。

#资源 🤗
public-apis:面向开发者的公共 API 列表 非常非常丰富的公共 API 清单,内容应有尽有。(star 2K)

XHS_Downloader: 小红书图文/视频 spider
FunASR:端到端语音识别工具包阿里。有语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。(star 1.2K)
使用 Python+ChatGPT 开发一个书籍摘要 AI Langchain 和 OpenAI embedding 开发一个书籍摘要工具。另外,作者使用 Streamlit 发布了一个在线体验网站
duangsuse::Echo
#dev #android 面试题 🤔 - 技术上提升最大的一个项目,展开介绍 对比业界同种算法流行和不流行实现、重写自己的任何项目,都比从事GPT都能完成的原型要好 - 为什么选择 Flutter,在业务方面学到了什么 Compose界原神的名气真的太大了,居然能用Navbar,Tab等自带组件,居然能调style! - Java 里重载和重写的区别 在编译期vs运行期确定函数,改方法签名vs改子类值 - 什么是线程安全 避免共享变量(不相交),或使用Atomic/独占锁 避免读写异步 - Service…
#life #statement 对频道、对最近设计稿的一些吐槽

这里本来是用于分享知识的👆,但我又没有多余时间维护它,最终看起来,就像一个草稿箱
我不能像回形针或何同学那样科普,甚至不能学习3b1b和Code Aesthetics 去做我还不愿意涉足的特效,我要传达的太多了…… 我要面对的历史包袱,也太具有迷惑性了

这些知识蛮细节,不一定能立刻写成代码用上。更多是一种解构和自嘲吧。
对编程而言,我是认真的。我不随波逐流,不会因为时代改变就觉得自己被抛弃,去转行


可是,这种执念给我的工程带来了很大的麻烦,比如之前说的EqvJS框架,就因为“新手教程的顺序连贯性,当前理论无法支撑”,而不能去实现简单的signal变量-队列 等模型

比如,因为理论不统一,已经搁了半个月的CLI parser

fun main(a:Argv)=a.Dict<App>()
enum class Format{html,csv,pdf}

class App(
var input:File,
var output:File,
var fmt:Ln<Format>=Format.CSV,
):CLI("""
i Input file
o Output file name
f Format for output file
""", "") {
fun main() {}
}


一个能完全用语文描述的设计模式,尽管归纳整理的过程让人抓狂,相信结果也会是好的 😨

比如,绝句的OOP术语发展历史:

class|interface|object
thing物|class类|insta例
data物|type遇|^name名


这种反复横跳,最终把 sealed class, data object, enum class 全都整理为type,并让其与 class name 有了不易记混的适用范围

EqvJS的各种功能咋写,不应该是首先考虑的点。 我必须找到它们不可或缺的理由,即便这会让既定设计变来变去…… 或许这才是它们的「护城河」吧!
Forwarded from Solidot
李开复的开源模型被发现是对 LLaMA 的重构

2023-11-14 14:57 by 通灵师

李开复创办的 AI 公司零一万物(01.AI)前几天发布了它的开源大模型 Yi-34B,公布的基准测试结果显示虽然模型参数少于其它大模型,但性能更出色。在 Hugging Face 的讨论区,开发者很快指出 Yi-34B 其实是对 Meta 开源大模型 LlaMa 的重构,最明显的变化是改了几个名字。它的开源许可证也没有提及 LlaMa。它也没有公布调试数据,让其他人能复现其基准测试结果。零一万物的估值高达 10 亿美元,已跻身独角兽行列。

https://huggingface.co/01-ai/Yi-34B/discussions/11

#开源
Forwarded from Solidot
Blender 4.0 释出

2023-11-15 00:01 by 镜中世界

开源 3D 建模软件 Blender 释出了 4.0 版本。主要新特性包括:Cycles 支持光和影的耦合,支持光滑表面的路径引导,支持苹果 Metal API 的 MetalRT 硬件光线追踪,HIP 后端支持 AMD RDNA2 和 RDNA3 APU,默认 UI 字体 Inter,Linux 和 macOS 版最低要求 OpenGL 4.3,等等。更多可浏览发布公告。

https://wiki.blender.org/wiki/Reference/Release_Notes/4.0

#开源
👍2
duangsuse::Echo
cg($dyn) 生成了 ()=>(a=3,f=(a)=>(a+1),r0=[f(1),a]) ,运行正常 - just(a) - f()=a f just(0)() 那再来一个 with(DSL)$lex=[[], [just, [[a], [f,[[],[a] ]], [f] ]], [f,[0, 0,[just]]], [0, f] //“类型推导”差到不能直接调用 ] ()=>(just=(a)=>(f=()=>(a),f),f=just(0),f()) 是0而不是3 实际上,()=>…
这位 Pixel #PLT #dalao 真是太清醒了,十分 #recommend
http://rigaux.org/language-study/language-study-slides/img13.htm

https://note.sbwcwso.com/

大佬对编程范式的了解很广。我是在 https://blog.vero.site/post/noulith 的codegolf语言看到的 🤔这语言的 a append= x 统一了列表和"str"的不可变,但我不喜欢
ppt显示
class Eq a where
(==): a a -> bool
(!=): a a -> bool

不过绝句早就是关系式编程了,纯函数算什么(这几天新增的更改,SQL JOIN)
- Str find(:Str) Idx
[me.iEach]*2 .:
i0\<i, me[i0+i]==s[i], i==n: return i0

- Any`+`(u:Int) me.[Int too]+u
- Int desc me.{0 "zero" 1~10"small" or "{me}"}

这不比as,when is in 强多了,还有新的Fn表达式 🤔
val add: Int.(Int)->Int = {x,y->x+y}
at add Fn.[Int Int A2]:A+B

type 'u'Num
- `==`(:u) YN
type Any
- == (:Any?) YN
- `\=`(:[Any? me], :Any?) YN
Forwarded from Solidot
16 岁少年用 Blender 创建的动画赢得了英国 YAY UK 动画奖

2023-11-16 22:19 by 破译滑铁卢

面向英国年轻人的 YAY UK(Young Animator of the Year)公布了 2023 年的获奖者:16 岁的 Euan Garbut 赢得了 15-18 年龄组的最佳动画奖:他在一分钟内描述了未来世界机器人给人类制作食物的过程。主办方称,该奖项由英国动画和 VFX 工作室的专业人士评选,开源 3D 建模软件 Blender 让年轻一代制作出令人称奇的动画成为可能。Euan Garbut 称他用 Blender 制作动画,Davinci Resolve 用于颜色分级 (colour grading)。

https://younganimator.uk/winners
https://younganimator.uk/winner/1699875910225x437970782709919500
https://news.ycombinator.com/item?id=38282166

#科幻
duangsuse::Echo
#blog #meme 看到易语言还在VB++ 的范式旁徘徊 😅,并且觉得编程语言 是种必须特色和备案的「核心技术」… 我想复刻下这2007年文章的口吻: “绝句.ju”十分钟入门教程 作者:转载必须注明出处 亲爱的朋友,您愿意花十分钟的时间,来了解一门全新的编程语言“绝句.未公开”吗?(搞笑向 btw. 很难想象标准库与ES7接轨,拥有函续、不/可变数据集、流/叠加、双主语的绝句,还能用“合规”的记法支持VB7时代的“正统中文编程”👀 - 起点 将123写到屏幕 100.123:[x] …
绝句的py化已经走向了YAML和Go的形状,已经不像那个满是def和class的语言了

最开始绝句不满Kotlin的两点,就是 List<T> fun<T> ,. 不对仗,以及一大堆 (private)val 前缀不够简洁

但那时反思主要是在中文语意上,而且当时执意给let mut穿小鞋: 量i=0;变数,j初0;常数 PI=3.14

后来const被规范为常量折叠API,变数和量也就区分为 在,i 0。 在这时,j 0 。这时主要的麻烦是 at: a 1; b 2: +1 的最佳实践有:块 时很难看

随着:块渗透进print、流控、异步…… 开始流行一种 - Dog bark (say: 'what {sound}'); - f'x' as:(x+1) 的全表达式风格
这种有趣的断言,把整个语言分为「式算折词典」5级, as: 就是“一折”能新建变量和ret的算式, 因此尾递归 也能以极其廉价的方式编写
- id'ab'(b=0) as:
now(a+1,b-1) : b==0
a

于是,现在的变量声明,变得符合人类习惯了。而且走向彻底的隐类型--伴随着对OOP的彻底分析,从而知道只有在type接口里,必须能写明类型

- 比赛 std.[Int as]:
红队 2
篮队 10
场 Inc.[Str Ln](1):"List<String>"
max(红队,篮队)

- 赋值 做,
a [{0~9} ]!
a加10

这时 0,i;求和
这时i<a.n,
求和 =,+ a[i]
i去右移
说,'{求和} {a}'


然后,我把易语言用户的猜数字又写了一遍
将123写到屏幕
100.123,[x]
(将x)写到屏幕


名 'T' `将`(:T) “名记平权”
- [文 将]`写到屏幕` 说,'{它}'

(0~10)(x), “如果(0 < x < 10)”。
(0~~10)(x), “如果(0 < x \< 10)”
(0的右~10的左)(x), “如果(0 \< x \< 10) ,因为数学(>18) 不自然,我换了”

这时,a 1;b 2
变数去换(a、b)
""{a==2, b==1}!
👎1
#statement ☺️绝句是帮我「改良编程」的望远镜,我现在设计的JS变量绑定框架、CLI结构体解析器, 都需要它的理论完善,才能在简洁+完备上打败既有框架

我不会因为太慢,或者貌似很「不切实际」,就暂停完善绝句模型。 在产生任何设计问题前,就该把错误扼杀掉--而不是日复一日上StackOverflow 去堆砌GPT都能写的脚本。
这是我编程的骄傲,是我口中「编程」的定义

也是因为它有太多值得我学习的地方。比如 (FS .txt/[a]):[str] str("Jack"~~"Rose") 就可以完成编解码+IO 。缺少了 Eq(两换),停留在 fromStr/toStr 的认知,是做不到这个程度的

就比如4天前的Svelte5 大会吧,

ww.eg=({width=10,height=20, it},

w1=width.as(x=>x*1),
area=Saw((w1,height)=>w1*height )(w1,height),
)=>
div(
(s,e)=>{Saw(console.log, area); 1..s.then(it({width:20})) },
area
)

都能写得这么规范,要React那些函数式框架有什么用呢?

说白了,就是js数据模型的缺失,导致jsx和vue那些模板一套一套的。 稍微允许[a,b,1.] 变量入驻数据,给let[]= 匹配加点料,DOM本身就是MVVM框架

#recommend 重构浣熊
https://refactoring.guru/refactoring/when
#PLT #OOP #design

☺️ 绝句的OOP部分完结了。 包含type,name,named 「典-构造器 interface」「名-class」「曾名-加构器」3种概念

type 类似Rust的 enum Either{A(A),B(B)} ,但可以外部扩展

type Zoo impl??
Zebra(:Name,:Age) //<>列方向是cols
Elephant(:Height) //^v行方向是Conds

type Zoo
power Int
Tiger(); Lion() //和enum WithData()一样,生成构造器

type Inc Int{>0} //类型只是N个字典+几个新词的组合
type 'T'Pairs [T T Col2] //所以,没有啥typealias

named 类似inner class,但可以外部扩展 Point(0,0).Arc(10)

type Any
Point'xy'(_:Int)

named Point.Arc(r:Int) //加构器
- draw 画圆

好吧,写错了,Any的Point构造器,理论上无法继承:type数据间不可以组合

但name呢? 传统的 abstract class有啥用?? 我很想扔掉它们,我在SO上搜了很多,但没人说服我为何「组合优于继承」(甚至这句话居然是OOP专家说的

type Geo
- draw

name Point'xy'(_:Int) Geo
^type
- flip Point
^type impl
- draw 画1px圆

这个语法是为OOP兼容保留(override fun 啥的太扯了),好像比接口多提供个构造器、protected复用(被Utils取代了)、final等「更准的函定性」

但它对语意真的没有啥贡献? 只是像Scala那样,简单把同名的 struct+trait 连起来,而且逼你单继承??

我是更看好Rust的impl式多态,包括py的Protcol,虽然很复杂 {}构造器也很乱,但类型的限界都很清楚,不像今日JVM C# 这些接口子类分不清的

---

其实我清楚,class比接口允许「更准的构造顺序..函定性」,它根本就是--js的传函数字典 ,或者说类=可改传的多项函数 接口=dyn字典

如果你写过愚蠢的 android.view.Listener ,会发现它们乐此不疲地把本该叫lambda()-> 的变量搞成override,所谓的设计模式。。。

^type 就是默认参数的另一种写法而已,而 ^type impl? 可以选择不封闭既有值

绝句主张函数与Fn值的统一,但考虑 - f'xy' 和 F.[Int Int a2] 本不一致,无法在语法上实现静态-动态类型的交融

期望未来能找到更彻底的「解决语法」(想到一个,除了构造器、加构器, 还有 type mv(src, dstFile) 这种「默认参器」
只要我换成 name mv(src, dstFile) ,是否就把函数和class联系起来了? 😋


btw. 绝句的结构写起来真是太爽了,可惜表现力比不上纯数据的JS。 希望在词级 算式级 也有更新的发现

btw. 我打算把语言改叫《海经》了,因为这个时代,已经不适合在单句和算式级别,纠结代码怎么写了。 手写的代码都在词乃至类型级别, 而且绝句一开始是为逗句缩进起名, 但如今它的对象和集合模型比缩进有趣一些
duangsuse::Echo
#PLT #OOP #design ☺️ 绝句的OOP部分完结了。 包含type,name,named 「典-构造器 interface」「名-class」「曾名-加构器」3种概念 type 类似Rust的 enum Either{A(A),B(B)} ,但可以外部扩展 type Zoo impl?? Zebra(:Name,:Age) //<>列方向是cols Elephant(:Height) //^v行方向是Conds type Zoo power Int Tiger();…
啊,真好。问题解决了 🥰

name Point'xy'(_:Int)  Geo
^type
- flip Point
^type impl
- draw 画1px圆

type draw默认参(x=0,y=0) Geo
- flip 不翻转
- draw 同上

draw :.
-y 10
-flip 翻转函数


这样让默认参器基于函数值,OOP和FP,二者就对仗了
duangsuse::Echo
#sql #ts Prolog 牛逼! 正确的关系式搜索+ 同时实现 parse 和 toStr 😱 #zhihu 灵感来源 e(E) -->{E = [I,Ea,Eb]}, %重写规则, 'eX'为优先级 %利用 链|e1(E) 括住内"*/" e1(Ea), op(I,"+-"), e(Eb); e1(E). e1(E) -->{E = [I,Ea,Eb]}, e2(Ea), op(I," */"), e1(Eb); e2(E). e2(X) --> number(X); ("(",…
#PLT #sql https://zhuanlan.zhihu.com/p/646479383

Z3-SMT 是SAT(可行性求解器)的增强版,即一种sympy 。比Prolog更擅长解数值,甚至能解数独(迫真 ,解决cargo的依赖版本(原神

from z3 import *
A, B, C = Bools('A B C')
# 创建一个求解器
s = Solver()

# 添加约束条件
s.add(Or(And(A, B), And(Not(A), C)))
# 检查是否存在解
if s.check() == sat:


Z3的API这么复杂,又要add check 又.model的, 不如和Keras做个联动,支持机器学习+逻辑编程好了。 哦,原来 state.add(x==1) 只能执行1次 不是flowgraph啊?
这API还真挺Pythonic
这种问题貌似Prolog不用限定类型都能解。 定义 Bool(A) 无非是为了重载,那And(bools) 有啥别的语意-即搜索范围呢? 强类型逻辑式编程?好奇怪的搭配


稍微对比几个同类项,都不会这么白象化逻辑式编程


#zhihu 上看到一些逆天观念,C的设计错误:

1:单返回值这个设计可能是受了数学上的f(x,y...)的影响
真的需要多返回值的时候,C就只能用指针搪塞一下了
2:连续不等式
如果 a > b > c, 则……
3: void不是类型

1. Go就支持func (ret, err) 。所以不仅调用难以组合,Err体系也给弄成错的,因为err!=nil时函数不可能有值
2. 写成 (a > b > c) 还是 (a>=x>=c) & (a~b)(x) ? 过了这个村, for(x) 和 x inbounds range 就不可能一致了
3. 数学没有void,所以我赞成省略类型=void

还有一些不逆天的C错误:

"\0" 不是数组,argv无法单作为值
赋值是表达式,而且允许
for(;b-c;) c+ --b; b--;//c+b-1, b-=2
强制转换语法 (T)+xx、类型前置,这个的影响非常深远,带来的麻烦无穷无尽
if, while, for 的小括号和大括号,switch break
for (i = 1; i <= 10; i++) ,这个 (1~10):[i] 也很毒瘤了
duangsuse::Echo
#PLT #sql https://zhuanlan.zhihu.com/p/646479383 Z3-SMT 是SAT(可行性求解器)的增强版,即一种sympy 。比Prolog更擅长解数值,甚至能解数独(迫真 ,解决cargo的依赖版本(原神 from z3 import * A, B, C = Bools('A B C') # 创建一个求解器 s = Solver() # 添加约束条件 s.add(Or(And(A, B), And(Not(A), C))) # 检查是否存在解 if s.check()…
还有一些FP的错误 #design »=:

(我们知道,OOP对象 constructor() 就是一个“多方法函数”,等同 when(arg0, {run:(self)=>overridedFun ,.})的闭包。是这样的「高阶函数」

- 函数作为值并不稀奇, 相反,滥用 partial(f) 与compose而非this链来隐藏参数,虽等价于 obj.bind.f ,却是一种无序亦无类型的表达习惯。typeclass是和C一样的无心智模型,这种散漫 不值得被崇拜

Python,Rust,Go 都使用了self参数,我觉得rs有 &mut self 和new()模式还算有理由的(当然这比OOP Factory还丑),但那些过于执着理论优雅,忽视程序员阅读时间的设计,还是不可原谅,还不如JS的f.call(this)

- curry 更是一种堪比Builder的,对传参的过度设计。它没有(还不允许有)名字,所以和那些新语言的 tuple(vs. Pair) 一样,造成了()函数或{}结构间的不一致
- FP好像都有「优秀的模块化和列表处理」,但对比py的同类项就会发现那些只是「因祸得福」。FP的所有工程性技巧都建立在这种“妙手”偶得上。正常做法的SEO被他们挤掉了
- 高复用组合、语意化、响应式 并非函数式的专利,而是它们做的功能少,而以为自己更懂原则 😅。它们的定义式还不如Excel

- 纯函数不够对称。基于(可loop化)递归的算式,本可以兼容 A+1, 1+B, A+B 这些逻辑推导的情况,但FP们空有一堆公式,却连 A=1,1=A 都做不到,还需为 pat match 内定语法!
- FRP Reactive 和各种State,Signal就是因为缺少「模式作为值」诞生的。 既然公式该作用于「变量」,副作用又指什么? 全局=值, printed="" 能改变关系算式(引用透明)吗?
- 数学不优雅。 数学用x<a,用A=[x y] 处理数据时,没考虑定义-引用双侧的简洁性 (区间,访问链,.)。 这导致加法独立于函数: 1.+(2).+(3) vs +(+(1,2),3)
确实数学不只是符号,但像数形结合时,也只能说Desmos,matlab和GL比手绘好得多、有条理的多,相信对几何图论也是如此

- 真正区别了 (+) vs (++) 的是物理性Vector,而Haskell没有哪怕为 List Int 实现加法,却说""+""和1+2 的交换律不一样。所谓「无意义的严谨」 🤓
- (&&print) vs (&) 这特性就像赋值表达式一样,是已被a?:b修正的可读性灾难,而函数式竟把 pass by lazy 当高性能卖点-这还不如Go指针/C宏 的多返回

- 就像0+1,Monad范畴也有自函子id作为(+0) 。而Monad.map就等同于this链,链处理当然好玩—而且无赋值,比如 obj?takeIf{}?.let{}yield (yield needFetch).blob()
所以IO Monad 还可以处理异常(级联返回)。但这值得业界学习吗? 比如 xs.map(x=>),fold 的语意该是 xs.as:[x], xs(Sum) 或Eqs(A,B)双转化
Ramda 和各种 immutable data 已经给JS带来很大麻烦了,还被说不严谨 ,其实那些人就是闲

👀
总而言之,但凡在加某种语法或「特殊处理」前,稍微想下使用频率,去与既有语法对比下, 都不会传承这样的问题
数学的问题是过于形式,缺乏读音和链式表达命名, 但某些编程就是太「实在」了,早该分析词频,删掉某些过度设计和常用词了
duangsuse::Echo
还有一些FP的错误 #design »=: (我们知道,OOP对象 constructor() 就是一个“多方法函数”,等同 when(arg0, {run:(self)=>overridedFun ,.})的闭包。是这样的「高阶函数」 - 函数作为值并不稀奇, 相反,滥用 partial(f) 与compose而非this链来隐藏参数,虽等价于 obj.bind.f ,却是一种无序亦无类型的表达习惯。typeclass是和C一样的无心智模型,这种散漫 不值得被崇拜 Python,Rust,Go 都…
https://www.zhihu.com/question/631144121/answer/3299457578

#js #java #web #news React系还有一张刁图,让我感叹 sql`${}` 居然都能成为稀奇事(虽然之前我想用但没找到包。貌似用BaaS有 prisma
目前还只有JS能做str安全注入

当然20年前C#就支持ASP, Razor还支持 <button formAction="@( () => await Db( $"INSERT INTO Bookmarks VALUES ( {slug} )" ) )" >

前后端同构当然更合理(并不是像PHP那样的伪共用),但不要区分use client和use server更好

原来Javaer才意识到自己只是 CRUD boy??
duangsuse::Echo
还有一些FP的错误 #design »=: (我们知道,OOP对象 constructor() 就是一个“多方法函数”,等同 when(arg0, {run:(self)=>overridedFun ,.})的闭包。是这样的「高阶函数」 - 函数作为值并不稀奇, 相反,滥用 partial(f) 与compose而非this链来隐藏参数,虽等价于 obj.bind.f ,却是一种无序亦无类型的表达习惯。typeclass是和C一样的无心智模型,这种散漫 不值得被崇拜 Python,Rust,Go 都…
#PLT #FP https://www.zhihu.com/question/28292740/answer/3297148810
看 moonbit 提到 (Node)Visitor 设计模式,觉得有趣就复述下 👀

Lit(1):Add(me,Lit(2)).eval==3

?? Expr
Lit'n'
Add'AB'(_:Expr)

- show me .:
Lit: "{n}"
Add: "{A.show}+{B.show}"

- eval me .:
Lit: n.[Num too]
Add: A.eval+B.eval

因为OOP无法外部扩展fun,但能加子类,所以请Visitor松耦合(py astor 靠字典,无需样板代码)

?? 'R'Expr.Vis
- as(:Add) R
- as(:Lit) R //因此 Lit'n' 有 - as(f:Expr.Vis) f(me)

me Show() [Str Expr.Vis]
- as(:Lit) "{n}"
me Eval() [Num Expr.Vis]

按道理 Show(add_3) 比 add_3(Show()) 优雅。但谁叫OOP是靠this @singledispatch 。不过OO的overload+override比Haskell归类性好多了

Oleg Kiseylov教授等人提出的Tagless Final技术,那就是直接抽象Expr的构造器集,这样函数会随着新子类被覆写,就像 Factory (天哪,FPer在搞事情前都不查重的吗)

-'V'(V [Int ExprV]) code1  V.Lit(1)

funcs Vshow [Show ExprV]
- Lit(NAME, :Show) show.res
funcs Vpostfix //逆波兰化

?? 'u'ExprV
^name
- Lit(:u)u
- Add'AB'(_:u)u

?? Column
Show(res:Str)
Eval(res:Num)

?? 'u'ExprV1 ExprV
- 添加的Node会被新V1show实现,因为现在Lit们 是能被class的函数

其实呢,[Show ExprV] 等于 [Str ExprV],这么写是因为 Haskell 的 class (Exprv t) 是按t重载的,不能手动指定Vshow

static成员实现不是subtype-=元类 时能做到的(这相当于有能+接口的“全局工厂” 比如说.. Gson 的那种)
同样, IntArray() fastutil 这些用复制粘贴特化泛型,也是因为 class 不是能被overload的 fun
但, #Rust 它们就是因为self参数,才这么无结构:

trait ExprGADT {
type Expr<T>;
fn lit(i: i32) -> Self::Expr<i32>;
fn neg<N>(A: Self::Expr<N>) -> Self::Expr<N>;
}

魔法并不是免费的,我们要牢记它的意图场景。
#FP #statement
https://www.zhihu.com/question/596624832/answer/3091106978

Lisp应该不算函数式编程语言吧,它唯一的好处就是在只有C--BCPL的世代支持了GC、选择了非符号的括树风格,用链表取代单步forif。 但是心智模型依然在C99附近徘徊啊,强检查数据之外,其范式并没有比C出众吧?甚至Lua的闭包和yield比圆括号们跨场景对称

范式说到底是「拆分数据上文」的方式啊。 无论FP的单方法函数、高阶组合、tvar窄化推导+GADT,还是OOP的多方法函数、this链、<T>+extends,直到运行时强转的语言……决定软件质量的并非自动测试,并非理论,而是对领域上文的正确列举

所谓PLT,编程语言理论, 就是为了正确理解应用惯用的输入结构、的分层次逻辑。只为尝试茴字的全N种写法 去学咋做翻译器,是种工程吧?

其实在我眼里,Haskell也不能算「定义式编程」的。 反而是numpy,ffmpeg,Matlab,Word这些软件拥有最定义式的、纯度最高的代码接口,而且,它们才是数学和线代的最前沿。把计科理解为数学的人,真的单纯得可爱。


一些连「行前缀重复」都消除不了的语言啊,连细粒度Reactive都改靠lazymemo的纯函数,鼓吹什么point-free (本质是this链) 和类型推导与扩展性,怎么看都不入「定义式+函数式」的大雅之堂吧?
无论类型还是函式、算式的定义语法上,都有2~3种“同样优秀方案”的语言, 能设计成这样的“形式化”语言,被称为优美且自然吗?

何况,基于 trait{} impl{} 与局部(associative type) 式的多态(multi-typed),不能说比子类型和<>类型好, 只能说是毫无使用处,而且在故作高深vs拖泥带水间反复横跳吧

倒不如说,这些语法项的选型,就是因为无用处才能显得混乱。 一旦有了能改变旧套路的灵感,没有什么理论是不能赋予价值的,哪怕只是看个乐子,都比只把跨界复制当作学习融入的人们强


编程语言呢,不是指责顾客挑食或“愚蠢”的 世代都有的聪明人。它是把烂程序、烂写法削好吃的厨师

魔法与应用,是不能对立的。 好的白魔法,终将取代黑箱子里的坏魔法。 像我这样,却会觉得JSPy,rb更懂纯函数DSL, HTML+CSS或JSON就是语法树和宏,Prolog就是更好看的SQL或Excel

编程技能不应该特殊化。打败程序员的,往往不是同行,反而是跨界的新手
有时也觉得 #CS#IT 界挺魔幻的,60~70年前的矩阵和协程,Lisp式的DSL,到今天还有框架 😔

当然,numpy和 Go func, kotlin.coro, Rust derive宏 已经远不是Fortran,OpenResty那些东西可比拟的

但究其根本,我觉得今天CS+IT的佼佼者,不少lib依然在犯70年前它们先辈的错误。
对于协程这个特性,究竟是DOM,node那样不靠package就包揽一切,还是像Go那样作为噱头,Erlang那样基于Actor,Kt这样与时俱进 最为正统呢?

拿js模拟过……
 总之就当自动传f1(回调),f局部变量在回调中, 所以调用f()能选择何时何处执行
Kt的结构化并发确实很有意思,但要谈可用性,JS的手动撤销和自动Dispatch更实在

btw一句,我讲的比较详细,但我对CPS不感兴趣,
主要是为了把回调链表与callstack、OS线程 做类比。确实编译原理和OS是分不开

本群人均素质挺高啊,都知道coroutine是靠CPS
但我更喜欢不纯粹的理论

有时我觉得这些也没必要说的, 我反复思考有好几年了,但它们终究是三句话讲完的程度呢
因为JS最开始是 func*(){} yield Promise,没有async

async是因为JS不能直接把函续交给then,要先yield给执行器(对等协程vs上下级协程)

Ruby的call/cc, C的"setjmp" 就是对等协程,它们符合CPS的刻板印象但不好用…… 总之异步编程反人类
异步编程也可以很美好的,比如 Reactive 就遥遥领先于Java,PHP这一套。 Nextjs应该是新时代的服务端语言

我想,大家都被限制在自己的编程生态圈,不去思考这些差异背后的进步方向,可能才是编程之道吧……

可能直到AI广泛辅助编程,这些问题都不会有答案
但我清楚AI无法完成写法的形式化,只能从根源上,让用户指定开多大线程池完成多少种Task,这些术语的差异才会伴随着“优化选项”消失

C 那种argc+argvec 的list,也只是术语的差异吗? 恐怕除了样板代码的多少,这些语言作为“app设计器”,也有根本不同
——
在我看来,无论是工业界最流行的语言,还是协程的理论讨论, 都是没有取得统一模型的
换句话说,每个语言有它的优点
这不是一件好事。 一个没有取得共识的工具,会阻碍人的泛化思考,会把编程当成一件机械的编码任务

其实明白编程和数学里的泛用性,又如何呢? 有人为此挣到钱,有人选择删了公开博客, 但到最后随着时代向前,知识也没啥可稀奇的吧

即便如此,我选择把编程视为一种乐趣和创作。
我不需要言辞间的“朴素” “平凡不难”,对于创作者来说,灵感,才能成为汗水里掷地有声的内核。 🕊
Forwarded from 层叠 - The Cascading
Mozilla 发布 llamafile,将 LLM 模型打包为「跨系统」的单文件可执行格式。

llamafile 可以利用 llama.cpp 及 Cosmopolitan Libc 将 LLM 模型(它们通常有至少数 GB 大小)的命令行版本或网页版本打包为单个可执行文件,并可在 Windows、macOS、Linux,甚至 BSD 系系统上执行。

- https://github.com/Mozilla-Ocho/llamafile
- https://hacks.mozilla.org/2023/11/introducing-llamafile/

#Mozilla
#design #plt
最近在整理的编程范式有点让我头疼…… 这个或许对学OOP有帮助吧:

//行列状多态,就是说一个类型由 字典C=A+B 定义
?? C A
b1 Str
- b2 Int

//以上声明里没写,故需要另加构造器
?? C
Cat(name:Str, b1="demo")
- b2 b1.(0).Int
Camel(ver=0)
b1 "Hi"
- b2 0

这样的好处是 sealed,data class 都非常简单-甚至多种子类都语法一致,与 #Haskell GADT 不同的是,它支持附带函数与隐式this

?? 'AB'Columns //泛型,单位状类型
Pair(:A,:B)
Triple(:A,:B,:C)

?? 'AB'way2
posL [A mayNO] //val posL: A?
posR [B mayNO]
Left(v:A) ; Right(v:B)

如果是新类型,还可以定义Enum甚至表格

?? RGB
R;G;B
?? 调料
甜 Int ; 咸 Int
- 咸 id==1 or 咸>1
醋 (0 0)
盐 (0 1)

学起来有点让人费解(当然这是我设计的), 虽说类型和值都是「构造器」,这样的大杂烩也太奇怪了(但,比用到再单独地学好吧?)