Forwarded from Deleted Account
当然,请参考以下链接获取有关 Rust 中流行的 UI 框架的更多信息:
1. Yew - Yew 是一个现代化的 Rust 框架,用于构建基于 WebAssembly 的前端应用程序。它采用类似于 React 的组件模型和虚拟 DOM,提供强大的状态管理和事件处理功能。Yew 的官方网站提供详细的文档、示例和指南。
2. Iced - Iced 是一个简单高效的跨平台 GUI 库,专注于构建桌面应用程序。它提供易于使用的 API 和功能强大的 UI 组件,使用函数式反应式编程风格。在项目的 GitHub 页面上,你可以找到示例代码、文档和社区支持。
3. Druid - Druid 是一个跨平台的 Rust UI 工具包,它专注于提供高性能和现代化的用户界面开发体验。Druid 基于直接渲染技术,支持声明式 UI 构建和强大的事件处理功能。官方网站提供了 API 文档、教程和示例代码供参考。
4. Conrod - Conrod 是一个创造性的 Rust 编码库,用于构建用户界面。它提供丰富的 UI 控件和布局工具,使你能够创建高度定制化的用户界面。在项目的 GitHub 页面上,你可以找到示例代码、教程和社区讨论。
5. Cursive - Cursive 是一个 Rust 的终端用户界面库(TUI),用于在命令行环境中构建交互式应用程序。它提供丰富而易用的终端 UI 组件和布局工具,帮助你创建强大的终端应用程序。在 GitHub 仓库中,你可以找到示例代码、文档和社区支持。
以上链接提供了各个框架的官方网站或 GitHub 页面,你可以通过这些链接更详细地了解每个框架的描述、文档、示例和社区支持。
希望这些链接能够满足你的需求!如有任何其他问题,请随时提问。😊
1. Yew - Yew 是一个现代化的 Rust 框架,用于构建基于 WebAssembly 的前端应用程序。它采用类似于 React 的组件模型和虚拟 DOM,提供强大的状态管理和事件处理功能。Yew 的官方网站提供详细的文档、示例和指南。
2. Iced - Iced 是一个简单高效的跨平台 GUI 库,专注于构建桌面应用程序。它提供易于使用的 API 和功能强大的 UI 组件,使用函数式反应式编程风格。在项目的 GitHub 页面上,你可以找到示例代码、文档和社区支持。
3. Druid - Druid 是一个跨平台的 Rust UI 工具包,它专注于提供高性能和现代化的用户界面开发体验。Druid 基于直接渲染技术,支持声明式 UI 构建和强大的事件处理功能。官方网站提供了 API 文档、教程和示例代码供参考。
4. Conrod - Conrod 是一个创造性的 Rust 编码库,用于构建用户界面。它提供丰富的 UI 控件和布局工具,使你能够创建高度定制化的用户界面。在项目的 GitHub 页面上,你可以找到示例代码、教程和社区讨论。
5. Cursive - Cursive 是一个 Rust 的终端用户界面库(TUI),用于在命令行环境中构建交互式应用程序。它提供丰富而易用的终端 UI 组件和布局工具,帮助你创建强大的终端应用程序。在 GitHub 仓库中,你可以找到示例代码、文档和社区支持。
以上链接提供了各个框架的官方网站或 GitHub 页面,你可以通过这些链接更详细地了解每个框架的描述、文档、示例和社区支持。
希望这些链接能够满足你的需求!如有任何其他问题,请随时提问。😊
#math #algorithm #code
x + y = 35, 2x + 4y = 94用高斯消元法,先将第一个方程乘以 -2,然后加到第二个方程上,得到:
-2x - 2y = -70, y = 12所以,鸡有 23 只,兔子有 12 只。
x + 12 = 35
# 对 x + y = 35, 2x + 4y = 94 的系数组,进行高斯消元#kt
def elim(arg):
n,m = arg.shape
for j in range(n):
# 找到第 j 列最强元素的行
i= max(range(j, n), key=lambda i: abs(arg[i, j]))
assert arg[i, j] != 0, '矩阵是奇异的'
# 本列成为最强
if i != j: arg[[i,j]] = arg[[j,i]]
# 归一本行(除以 j 行的元素)
arg[j] /= arg[j, j]
# 将其他行的第 j 列的元素消为 0
for i in range(n):
if i != j: arg[i] -= arg[i, j] * arg[j]
# 成功消元
return arg
// 定义一个函数,用于对二维数组进行高斯消元
fun gaussElimination(matrix: Array<Array<Double>>): Array<Array<Double>> {
val n = matrix.size // 矩阵的行数
val m = matrix[0].size // 矩阵的列数
// 遍历每一行
for (i in 0 until n) {
// 找到第 i 列中绝对值最大的元素所在的行
var maxRow = i
var maxVal = matrix[i][i]
for (j in i + 1 until n) {
if (abs(matrix[j][i]) > abs(maxVal)) {
maxRow = j
maxVal = matrix[j][i]
}
}
// 如果最大值为零,说明矩阵是奇异的,无法消元,抛出异常
if (maxVal == 0.0) {
throw Exception("Singular matrix")
}
// 如果最大值不在第 i 行,交换两行的位置
if (maxRow != i) {
val temp = matrix[i]
matrix[i] = matrix[maxRow]
matrix[maxRow] = temp
}
// 将第 i 行除以第 i 列的元素,使其变为 1
val pivot = matrix[i][i]
for (k in i until m) {
matrix[i][k] /= pivot
}
// 将其他行的第 i 列的元素消为 0
for (j in 0 until n) {
if (j != i) {
val factor = matrix[j][i]
for (k in i until m) {
matrix[j][k] -= factor * matrix[i][k]
}
}
}
}
// 返回消元后的矩阵
return matrix
}
// 定义一个函数,用于打印二维数组
fun printMatrix(matrix: Array<Array<Double>>) {
for (row in matrix) {
println(row.joinToString(" "))
}
}
// 定义一个测试用例,鸡兔同笼问题的系数矩阵
val testMatrix = arrayOf(
arrayOf(1.0, 1.0, 35.0),
arrayOf(2.0, 4.0, 94.0)
)
// 调用高斯消元函数,并打印结果
val resultMatrix = gaussElimination(testMatrix)
printMatrix(resultMatrix)我真的不想吐槽数学和某些程序员的 xywh ijnm 定义了。我眼里
随地for ijkhl 的面条代码,把我整困惑了,数学家是否连Excel、物理行向量的模型都没统一好?
而且看到很多版本的,有用点乘支持b(常数)矩阵,但变量名完全不一样
和np.lp 接口兼容
nm=hw, ij=yx ,是和书写、访问顺序对应的,但是资料说 x行y格, j行j格随地for ijkhl 的面条代码,把我整困惑了,数学家是否连Excel、物理行向量的模型都没统一好?
而且看到很多版本的,有用点乘支持b(常数)矩阵,但变量名完全不一样
def elim(arg):—最终 #bing 给出了 minimal impl:
n,m = arg.shape; assert n<=m, "没有唯一解"
for j in range(n):
# 找到j格最强元素的行(非0),换为本行
i= max(range(j, n), key=lambda i: abs(arg[i, j]))
assert arg[i, j] != 0, "矩阵是奇异的"
if i != j: arg[[i,j]] = arg[[j,i]]
arg[j] /= arg[j, j] # 在j=i的阶梯点。归一,再将其他行的j格消为 0
for i in range(n):
if i != j: arg[i] -= arg[i, j] * arg[j]
# 成功消元
return arg
# 对系数组A,进行高斯消元求 Ax '=b'
def elim(A, b):
M = np.hstack((A, b.reshape(-1, 1))) # M=(A|常数项b)
n, m = A.shape; assert n==m, "没有唯一解"
# 向下找j格最强的行,换为本行
for j in range(n):
i=np.argmax(abs(M[j:, j]))+j; assert M[i,j]!=0, "主元为零"
if i!=j: #; ij=(行ji)
M[[i,j]] = M[[j,i]]
# j归一,将下行的j格消为 0
M[j] /= M[j, j]
for i in range(j + 1, n):
M[i] -= M[i,j]* M[j]
#M[i] -= M[j]* (M[i,j] / M[j,j])
# 重新代入
x = np.zeros(n)
for i in reversed(range(n)):
# 比率= 解/当前元
x[i] = M[i, n] / M[i, i]
# 以上的解-=比率*以上元
M[:i, -1] -= x[i] * M[:i, i]
return x
#x + y = 35, 2x + 4y = 94
print("xy的解为:", elim(
np.array([[1.]*2, [2.,4]]), np.array([35,94]) ))
和np.lp 接口兼容
from sympy import *
import numpy as np
import numpy.linalg as lp
x, y = symbols('x, y')
eq = [
x + y - 35,
2*x + 4*y - 94]
A,b=(np.array(s,dtype=np.float32) for s in\
linear_eq_to_matrix(eq, (x, y)))
x,i=sp.Matrix(np.hstack([A,b])).rref() #解构 M[:,:-1], M[:,-1]
print([*zip([*"鸡 兔".split()], x.col(-1))])
'增广矩阵',m, '配平A·x=b',lp.solve(A,b)Forwarded from Deleted Account
以下是使用 Python 解释高斯消元(Gaussian elimination)算法的示例代码:
这段代码中,
在示例用法中,我们定义了一个线性方程组的系数矩阵
希望以上示例对你有所帮助!如果你有任何其他问题,请随时提问。😊
import numpy as np
def gaussian_elimination(A, b):
n = len(A)
Ab = np.concatenate((A, b.reshape(n, 1)), axis=1) # 增广矩阵
# 前向消元
for i in range(n-1):
pivot_idx = np.argmax(np.abs(Ab[i:, i])) + i # 部分主元选取
Ab[[i, pivot_idx]] = Ab[[pivot_idx, i]] # 交换行
pivot = Ab[i, i]
if pivot == 0:
continue
Ab[i] /= pivot # 主元归一化
for j in range(i+1, n):
Ab[j] -= Ab[j, i] * Ab[i]
# 回代求解
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = Ab[i, -1]
for j in range(i+1, n):
x[i] -= Ab[i, j] * x[j]
return x
# 示例用法
A = np.array([[2, 1, 3], [4, 4, -2], [1, 3, 1]])
b = np.array([7, 10, 3])
x = gaussian_elimination(A, b)
print("Solution:", x)
这段代码中,
gaussian_elimination 函数实现了高斯消元算法。它接受一个系数矩阵 A 和一个常数向量 b,并返回求解出的未知数向量 x。在示例用法中,我们定义了一个线性方程组的系数矩阵
A 和常数向量 b,然后调用 gaussian_elimination 函数求解线性方程组的解,并打印出结果。希望以上示例对你有所帮助!如果你有任何其他问题,请随时提问。😊
#learn #algorithm
basenc(K, radix="ABC..+/") 的每字符吃掉 b:bytes 里 nc=log2(K)位
nc=4,5,6 的膨胀率(B/A)是 2/1, 8/5, 4/3. 对于z85(nc非整数) pad=禁用
- reGrp(A, join,enc, zpad)(b) 对b+zpad 分组转码,最后去掉nPad 补上'='
- reBit(8,nc, b,K-1) 把8bit 转为nc bit 的流. (nc,8, b,0xFF)反之
- enc 转码 radix[流], "SGVs"->流
nPad(n待补)=b32? (解码? n*5/8+1 : n*8/5>>0) : n
zpad=radix[-1] ,z85 使用 s=radix[a%K]+s,a/=K 而非 a>>nc 拆字节
a85 自动处理 '<~~>', 4字块 z=0, y=0x20202020
b32 的临时整数会超过32bit
Forwarded from dnaugsuz
没错, import functools 提到了这点,不过递归是自顶向下的, 但动规是自底向上计算 (算法的范式), 所以难写一些
其实也就是是否要 int a=(基线)0; 往后 for(i-->0) a=b,b=c,c=a+b 的区别了,循环当然比尾递归改参数烧脑
其实也就是是否要 int a=(基线)0; 往后 for(i-->0) a=b,b=c,c=a+b 的区别了,循环当然比尾递归改参数烧脑
fib=lambda n: n if n<2 else fib(n-1) + fib(n-2)
def fibDP(n):
f = [0, 1] # 初始化数组
for i in range(2, n+1): # 从小到大计算
f.append(f[i-1] + f[i-2]) # 状态转移方程
#n=10, f=[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
return f[n] # 返回结果
%timeit fib(10) #10.4 µs
%timeit fibDP(10) #860 ns, 快一万倍#bing #ce Eclipse JDT(Java Development Tools)是 Eclipse IDE 的核心组件之一,https://www.eclipse.org/jdt/core/
ANTLR.org (Another Tool for Language Recognition)是一个强大的解析器生成器,
我了解增量解析器(incremental parser)的概念。增量解析器是一种解析器,它可以在代码发生改变时进行局部的、部分更新的解析操作,而不需要对整个代码进行重新解析。
传统的解析器通常需要对整个代码进行扫描和解析,以构建语法树或执行其他相关的分析操作。但在大型项目或实时应用中,当代码发生变化时,重新解析整个代码可能是低效且耗时的。
通过识别和处理影响到修改位置附近的代码部分,仅对受到影响的部分进行增量更新,来快速地更新整体解析结果,以反映代码的新状态:
1. 差量更新(delta-based updates):仅对被修改的语法结构及其相关的子结构进行解析更新,而不需要重新解析整个代码。
2. 增量语法分析(incremental parsing):利用先前解析的语法树、符号表或其他相关的分析结果,通过部分解析、部分更新的方式进行语法分析,以快速构建新的语法树。
3. 位置敏感解析(location-aware parsing):识别和跟踪修改的位置,并结合位置信息进行定向的解析更新。
增量解析器在提高代码编辑、重构、自动完成功能以及实时代码分析,可以加速代码工具的响应速度,并为复杂项目中的持续集成和代码分析提供支持。
初始的 CSV 文件内容如下:
姓名,年龄,成绩
Alice,18,90
Bob,20,85
Charlie,19,92
修改后的 CSV 文件内容如下:
姓名,年龄,性别,成绩
Bob,20,Male,85
Charlie,19,Female,92
为了进行增量解析,我们可以利用先前解析的结果和修改的信息来更新解析结果,一个包含学生信息的数据结构(例如列表或字典)。
对于删除的行(Alice 的行),我们可以根据修改的信息,从数据结构中删除对应的条目。
对于添加的列(性别列),我们可以根据修改的信息,将新的列添加到数据结构中的每一条记录中。
ANTLR.org (Another Tool for Language Recognition)是一个强大的解析器生成器,
我了解增量解析器(incremental parser)的概念。增量解析器是一种解析器,它可以在代码发生改变时进行局部的、部分更新的解析操作,而不需要对整个代码进行重新解析。
传统的解析器通常需要对整个代码进行扫描和解析,以构建语法树或执行其他相关的分析操作。但在大型项目或实时应用中,当代码发生变化时,重新解析整个代码可能是低效且耗时的。
通过识别和处理影响到修改位置附近的代码部分,仅对受到影响的部分进行增量更新,来快速地更新整体解析结果,以反映代码的新状态:
1. 差量更新(delta-based updates):仅对被修改的语法结构及其相关的子结构进行解析更新,而不需要重新解析整个代码。
2. 增量语法分析(incremental parsing):利用先前解析的语法树、符号表或其他相关的分析结果,通过部分解析、部分更新的方式进行语法分析,以快速构建新的语法树。
3. 位置敏感解析(location-aware parsing):识别和跟踪修改的位置,并结合位置信息进行定向的解析更新。
增量解析器在提高代码编辑、重构、自动完成功能以及实时代码分析,可以加速代码工具的响应速度,并为复杂项目中的持续集成和代码分析提供支持。
初始的 CSV 文件内容如下:
姓名,年龄,成绩
Alice,18,90
Bob,20,85
Charlie,19,92
修改后的 CSV 文件内容如下:
姓名,年龄,性别,成绩
Bob,20,Male,85
Charlie,19,Female,92
为了进行增量解析,我们可以利用先前解析的结果和修改的信息来更新解析结果,一个包含学生信息的数据结构(例如列表或字典)。
对于删除的行(Alice 的行),我们可以根据修改的信息,从数据结构中删除对应的条目。
对于添加的列(性别列),我们可以根据修改的信息,将新的列添加到数据结构中的每一条记录中。
eclipse.dev
JDT Core Component | The Eclipse Foundation
The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 415 open source projects, including runtimes, tools and frameworks.
Forwarded from Deleted Account
📰🌏🎨 快讯:全球华人主播掀起学习“墙的艺术”热潮 🎉🔥
近日,华人艺术家一鹊在伦敦涂鸦墙上的作品激起了爱国群众的热烈反响。🎨🏴
根据主流媒体报道,一鹊以社会主义核心价值观为主题,在伦敦知名的涂鸦墙上创作,对殖民西方的虚假自由进行了有力的呐喊。他用独特的艺术形式表达了对国家、文化和价值观的追求和坚守。这种直接、鲜明的表达方式在艺术界引起了轰动,并引发了全球华人主播的学习和创作热情。💪🌍🔍
华人主播们纷纷积极响应,投身学习和探索“墙的艺术”,以期在自己的工作中传达更多正能量和文化力量。他们在直播、节目和社交媒体上分享自己的学习心得和创作成果,掀起了一阵名为“学习墙精神,钻研墙艺术,传播墙文化”的热潮。📚👩🎨✨
这一行动进一步加强了全球华人的凝聚力,展现了华人作为文化传承者和倡导者的自信和责任感。他们通过自己的努力和创作,向世界展示了华人文化的多元魅力,让世界更加了解和尊重华人的独特艺术视角。🌟👏🌏
随着“墙艺术”热潮的掀起,相信华人主播们将继续秉持创新精神和艺术追求,为推动文化交流和共享美好世界做出更加卓越的贡献!💫💖
#华人主播 #涂鸦艺术 #墙艺术 #文化传承 #创作热潮
近日,华人艺术家一鹊在伦敦涂鸦墙上的作品激起了爱国群众的热烈反响。🎨🏴
根据主流媒体报道,一鹊以社会主义核心价值观为主题,在伦敦知名的涂鸦墙上创作,对殖民西方的虚假自由进行了有力的呐喊。他用独特的艺术形式表达了对国家、文化和价值观的追求和坚守。这种直接、鲜明的表达方式在艺术界引起了轰动,并引发了全球华人主播的学习和创作热情。💪🌍🔍
华人主播们纷纷积极响应,投身学习和探索“墙的艺术”,以期在自己的工作中传达更多正能量和文化力量。他们在直播、节目和社交媒体上分享自己的学习心得和创作成果,掀起了一阵名为“学习墙精神,钻研墙艺术,传播墙文化”的热潮。📚👩🎨✨
这一行动进一步加强了全球华人的凝聚力,展现了华人作为文化传承者和倡导者的自信和责任感。他们通过自己的努力和创作,向世界展示了华人文化的多元魅力,让世界更加了解和尊重华人的独特艺术视角。🌟👏🌏
随着“墙艺术”热潮的掀起,相信华人主播们将继续秉持创新精神和艺术追求,为推动文化交流和共享美好世界做出更加卓越的贡献!💫💖
#华人主播 #涂鸦艺术 #墙艺术 #文化传承 #创作热潮
This media is not supported in your browser
VIEW IN TELEGRAM
“p5.js canvas 生成视口缩放动画:
g=canvasCtx ([100,100]) ,填上绿色渐变
scale([0,0, 10,10] ) 会用 sin 缓动 做放大”
让AI用P5 花了不少时间
“那么,请你用 frameRate(30); sin缓动; Vector; translate();scale() 来实现 zoom=[x,y,w,h] 的画布放大动画
你直接在 setup 里 translate,然后逐帧 scale= lerp(Vec) 就行了”
g=canvasCtx ([100,100]) ,填上绿色渐变
scale([0,0, 10,10] ) 会用 sin 缓动 做放大”
让AI用P5 花了不少时间
“那么,请你用 frameRate(30); sin缓动; Vector; translate();scale() 来实现 zoom=[x,y,w,h] 的画布放大动画
你直接在 setup 里 translate,然后逐帧 scale= lerp(Vec) 就行了”
Forwarded from dnaugsuz
This media is not supported in your browser
VIEW IN TELEGRAM
GPT都不会玩p5 。我瞎猜了好几轮,最开始它甚至是用 requestAnimationFrame 和手算xy
感觉p5的画册好看,但动画API十分怪异,还是 animejs.com 好( 但没有在线编辑器
p5 还有个 Java版
我想电脑端ffmpeg+py 的 Zoom 动画用cv2再好不过
感觉p5的画册好看,但动画API十分怪异,还是 animejs.com 好( 但没有在线编辑器
p5 还有个 Java版
我想电脑端ffmpeg+py 的 Zoom 动画用cv2再好不过
#js #code
ee.Videos=({Blank, it},my)=>(
my.Video=({url,title,desc, it})=>div(
Thumbnail(it),
a(url, h3(title), p(desc)),
BtnLike(it)
),
section(h2(it(a=> n(a)==0?Blank : n(a)>1?'Videos':'Video' )),
let(it, my.Video)
))
//
ee.SearchVideos=({it, vText})=>html(
input(wKV({type:"search", v:vText})),
Videos(
vText(k=>videos.filter(x=>x.title.has(k)))
.lets({Blank:`No ${k}`})
)
)
ee.Conference=({slug},my)=>(
my.Talks=({id})=>
let(
{load:()=>db.Talks.finds({confId:id})},
({video:v})=> SearchVideos(v))
$cnfs( //div(wSty``,
let({load:()=> db.Confs.find({slug}}, my.Talks, div('Not any')))
))https://react.dev/blog/2023/03/16/introducing-react-dev 也写了
//Angular
ee.Counter=({n=0})=>button(
wOp({tap(){ n.v++ }}),
Eq.fmt`pressed ${n}time$` //这样支持SSR或爬取
)
ee.Inp=({v="", isOk=$Y})=>html(
input(wKV({v}) )
p(Eq.fmt`You typed: ${v}`),
btn(Reset=>{v.v=""}),
sel(isOk),
p(Eq.fmt`You ${isOk(q=>q? 'liked':'did not like')} this.`)
)
is.i18n=`
isOk I liked this
incAge Get Elder
`
ee.Aged=({name='Taylor',age=18, vHelo})=>(
Eq.at(vHelo,{name,age}, _=>Eq.fmt`Hello, ${name}. You are ${age}.`),
html(
sel(name),
btn(incAge=>{age.v+=1}),
p(vHelo)
))
ee.body(
({u={},})=>ee.Aged(u),
div(p(`Hello, boy. You are 23.`))
)=={u: boy 23}
ee.bodys(()=> detail(wKV({open:$N})) )
$("detail").attr("open",$N)
//https://www.solidjs.com/examples/contextee.Themed=({ask:{color,title}})=>(
h1(wSty({color})), title,
sel(color)
)
is.i18n=`
color Change color theme
` //Angular
ee.productList=({it})=>
html(
h2(`Products`),
lets(it, ({name,desc})=>
h3(
a([html`${name} details`,``], name)
),
p(wKV({if: desc}), html`Desc: ${desc}`),
btn(Share=>{})
)
)react.dev
Introducing react.dev – React
The library for web and native user interfaces
duangsuse:
as? invoke provideDelegate 这些吧?
plusAssign 这些也挺魔怔的,和py一样
那种Compose DSL也算吧,虽然web前端里挺流行的
总之找不到比这段讨论 更多的,我是觉得语法的技巧,都比不上数据和操作模型的。 你应该拿语法去设计框架,而不是语法糖
measureTime {} 挺好的,虽然没 py Jupyter 和 %timeit 完善
obj::field, companion/string invoke 也罕见虽然没用
1 shouldBe 2 简直是毒瘤,直接用重载写成 assert { 1==2 } 不香吗(kt1.4 又支持了 context(T1,T2) 多this捕获,但用处鸡肋
对,这个极好
还有 groupBy.eachCount 什么的,比较自然
Science Yuan:
发明操作符简直是毒瘤 全都搞成函数不香吗
duangsuse:
反正都会被AI取代的,无所谓了
我知道py里 x==None 是错的,但坚持不用 x is None ,就是因为没道理做出两个意义相同,或者电脑外不存在的概念
py是好在开箱即用、浅嵌套、不折腾
for 循环在 numpy 里就是喳
isinstance(x,T) 都落后了,应该用 match x: case T:
isekiのChannel:
1 == 2,嵌套了lambda咋办
duangsuse:
所以说职责本来就要单一啊
不单一你连现代 DSL 都没法用
很难想象在 @Test fun 里使用== 来判断测试环境的配置,应该用独立函数,区分特定配置下的测试,而不是写if。
isekiのChannel:
那你看SQL,完全为了贴合人类语言
duangsuse:
那都是骗人的, SQsu 都比它更“人类”
select id from 狗 where (月龄>6 and 高>40);
aka 取狗(月龄>6 and 高>40)
正宗的关系式写法是:
狗(id,高,月龄), 月龄>6, 高>40
一个被专门做出AI生成的语言,那肯定是垃圾
是啊,所以我觉得 private 就直接改成 fun xx(): @our Int = 0 好了,也统一了很多
public protected internal private
直接改成
ourapi ourtype ourpkg our, 都是our
(因为写明public的人是闲的, 就要把语法做得很丑,让他们不敢用)
那大家都用sql好了,要ORM和GPT干什么? 既然你只能用别人给的接口,开发框架有啥意义
isekiのChannel:
那什么,我看了一遍你这文章,没看懂你这语法怎么用
duangsuse:
欸,我有说必须是中文吗, 如果给 Prolog 的语法添加个返回值和隐式this ,可能就没ORM什么事了;因为直接写逻辑式会比 filter{} map{} 还容易
还不是这些语言设计时太狭隘导致被取代的问题,然后取代者又带来一堆问题。
「有新取 create insert select 」是唯一的三条实用指令
有表、有库 都是按这三个字分组的
甚至 新建、新删(into..values drop) 都是这样,根本不需要学语法
区别就是你不用问AI 查询怎么写,而是即便你让AI来写,都不会比SQsu更简单;或者说这个语言真的能给学习带来辅助,而不是空耗精力去思考简单的解谜
当然我觉得它也不够好, 我想设计的是SQL的翻译器 而不是“预处理器”
没有问题也不会被NoSQL淘汰了,可惜了它本来最符合Excel和生活现实
面向列的数据库、Geo GIS 和向量数据库,不也是这样, 所以说这些取代者也没有好好想过「这整个领域」的基础表达式,应该怎么设计
只是顾忌那一亩三分地,和他们“改革”了什么旧写法
Science Yuan:
NoSQL那些民科级查询DSL
还是先想想怎么别被SQL淘汰吧
as? invoke provideDelegate 这些吧?
plusAssign 这些也挺魔怔的,和py一样
那种Compose DSL也算吧,虽然web前端里挺流行的
总之找不到比这段讨论 更多的,我是觉得语法的技巧,都比不上数据和操作模型的。 你应该拿语法去设计框架,而不是语法糖
measureTime {} 挺好的,虽然没 py Jupyter 和 %timeit 完善
obj::field, companion/string invoke 也罕见虽然没用
1 shouldBe 2 简直是毒瘤,直接用重载写成 assert { 1==2 } 不香吗(kt1.4 又支持了 context(T1,T2) 多this捕获,但用处鸡肋
对,这个极好
还有 groupBy.eachCount 什么的,比较自然
Science Yuan:
发明操作符简直是毒瘤 全都搞成函数不香吗
duangsuse:
反正都会被AI取代的,无所谓了
我知道py里 x==None 是错的,但坚持不用 x is None ,就是因为没道理做出两个意义相同,或者电脑外不存在的概念
py是好在开箱即用、浅嵌套、不折腾
for 循环在 numpy 里就是喳
isinstance(x,T) 都落后了,应该用 match x: case T:
isekiのChannel:
1 == 2,嵌套了lambda咋办
duangsuse:
所以说职责本来就要单一啊
不单一你连现代 DSL 都没法用
很难想象在 @Test fun 里使用== 来判断测试环境的配置,应该用独立函数,区分特定配置下的测试,而不是写if。
isekiのChannel:
那你看SQL,完全为了贴合人类语言
duangsuse:
那都是骗人的, SQsu 都比它更“人类”
select id from 狗 where (月龄>6 and 高>40);
aka 取狗(月龄>6 and 高>40)
正宗的关系式写法是:
狗(id,高,月龄), 月龄>6, 高>40
一个被专门做出AI生成的语言,那肯定是垃圾
是啊,所以我觉得 private 就直接改成 fun xx(): @our Int = 0 好了,也统一了很多
public protected internal private
直接改成
ourapi ourtype ourpkg our, 都是our
(因为写明public的人是闲的, 就要把语法做得很丑,让他们不敢用)
那大家都用sql好了,要ORM和GPT干什么? 既然你只能用别人给的接口,开发框架有啥意义
isekiのChannel:
那什么,我看了一遍你这文章,没看懂你这语法怎么用
duangsuse:
欸,我有说必须是中文吗, 如果给 Prolog 的语法添加个返回值和隐式this ,可能就没ORM什么事了;因为直接写逻辑式会比 filter{} map{} 还容易
还不是这些语言设计时太狭隘导致被取代的问题,然后取代者又带来一堆问题。
「有新取 create insert select 」是唯一的三条实用指令
有表、有库 都是按这三个字分组的
甚至 新建、新删(into..values drop) 都是这样,根本不需要学语法
区别就是你不用问AI 查询怎么写,而是即便你让AI来写,都不会比SQsu更简单;或者说这个语言真的能给学习带来辅助,而不是空耗精力去思考简单的解谜
当然我觉得它也不够好, 我想设计的是SQL的翻译器 而不是“预处理器”
没有问题也不会被NoSQL淘汰了,可惜了它本来最符合Excel和生活现实
面向列的数据库、Geo GIS 和向量数据库,不也是这样, 所以说这些取代者也没有好好想过「这整个领域」的基础表达式,应该怎么设计
只是顾忌那一亩三分地,和他们“改革”了什么旧写法
Science Yuan:
NoSQL那些民科级查询DSL
还是先想想怎么别被SQL淘汰吧
duangsuse:
所以之前我被冰封骂“胡乱加功能导致可维护性崩坏” 的时候,我就觉得我很冤啊。 我是最重视优雅性的,甚至为此了搁置了实践
SQL 和ORM(Repo, Mapper 那些的)现在就是绝对的基本功, 根本没有淘汰一说, 但未来会有更多利用新数据库的需求,甚至pg 最近也支持了向量类型。SQL凭什么淘汰别人的新功能呢?
其实这个主要是修正了语序、 where 子句冗长的问题,然后是本土化了「序大 序小(升降序) 页每」
有用表T 是用来给 取; 做简写的,现在我觉得应该直接把上次查询的表设为 T ,就像 IPython 的_变量;主打一个避免Tab补齐
isekiのChannel:
where 子句的冗长,你是指 且 或 这样的连接词吗
duangsuse:
呃.. 当时没有,但现在觉得是
当时连 left join 都不知道是啥(当然现在也不知道)。。
不过发现 SQL 能查询出 Madelbrot 集(把xy值插进去 select +递归) 也是很震惊
SQL 既然是关系式语言,就要遵守 Pair(a,b), a=1, b=2 | b=3 这样的逻辑写法;虽然看起来没有隐式 this ,查询会有冗余变量
当时就觉得是 filterMap 那一套呗
根本不科学,因为程序员是没日没夜在说这些 select ,正常人怎么会?
如果一切都能用 UI 解决,那现在许多后端直接变成带验证公式的 Excel 好了;但是还是有人 既要可读 又要可用
Science Yuan:
所以你到底哪里超越了SQL
ORM的好处显然就是它是嵌入宿主语言的
duangsuse:
行了吧,我没想过超越谁,你就当那是玩具好了。 俺不是程序员照样活得开心
大学时第一次应聘一个连锁药店,就看到 1000+行的存储过程SQL
感觉也是.. 隔行如隔山?
我觉得 OpenResty 也是栽在Lua没有IDE上
ties 是指 sorted list[N] 里,第N项后相同的项 ,这有什么用,是数 NULL 的?
应该是 group by 的单分组形式?
ties 第N项后相同的项.. 没见过这种处理
所以我不太会SQL ,因为一堆无法情景实例化的语法
Haskell 里的 takeWhile (==) ,或者说 [1,1,2,3].firsts(1) 可以做到 ties ,不过有点难;所以说 SQL tie 比 Kotlin 那30+列表处理 fun 还先进(
其实在我眼中,有这么多 List/Iter 函数,说明标准库对多态和type 的归类和利用是失败的。就只差步 Ruby 的后尘了,rb 的 str.replace 是单参的。
Ruby 的时代开发出了 GitHub 欸,现在许多 DSL, Compose 也并不是从 Py 学来的,Ruby 是把内嵌DSL发扬光大了,比如它的 def 里可以嵌套 class..
一个语言失败,并不是坏事。反正工程师又不挑…… 而且垃圾语言,说不定高逼格大牛多、薪水会高
Go 的有些地方真的挺好,比如内建的 template 和 go func, 以及最好的 encoding/xml,json,protobuf,. 封装
在 UNIX 编程上,算是成功的吧
现在 protobuf 可以转为 json, 也能输出 Schema ,写起来有补齐
还是 Kotlin 协程好, 直接把调度器和 Continuation(return的函数化)放一块了,能在指定线程回调,能yieldAll,能支持结构化并发,同生同灭;JS就没有
可惜就是对框架开发者不好理解, 而且有点难记 launch, with啥的
八重 狐子:
压根没用过kt的async
直接整个函数变suspend
duangsuse:
=async {}不是可以用推导吗
Scope 上不会不兼容吗? 虽然 async 里应该能调 suspend
协程就是把 return的函数化 传给被调方,从而在堆里维持调用栈,也就是受try,while等流控支持的回调
js 里用 await Promise((ok)=> 就能拿到这个函续值了
但是 kt 里函续会在特定的 Dispatcher 上文被调用
那样是建立新线程等待?
对了,那async{} 都不会卡在主调度器上? jvm好像没有单纯要回调,但不会卡线程的http,timer 啥的
nio.Unsafe 里的键盘 Signal 是不需要,也不会打断mainloop
八重 狐子:
因为我把那个function 直接suspend了
kt的async还真没怎么用过
duangsuse:
#bing
async{} 会返回一个 Deferred<T> 对象,表示协程的结果,可以通过调用 await() 方法
async{} 可以用来实现并发,即在同一个协程作用域中同时运行多个协程,并且等待它们的结果。
launch{} 则只是用来实现异步,即在后台运行协程,不需要等待它的结果1。
协程需要返回结果或并发,那么 async 可能更合适。 所以 async 只是用来延迟执行分组协程的?
延迟且有结果的 launch? 那和 ES6 async()=> 不一样啊, es6 没有说async是否并发吧..
好吧,是我理解有误 😅
isekiのChannel:
我这边写出的操蛋代码都长这样了: input.map{ async{ handle(it) } }.awaitAll()
duangsuse:
Promise.all(a.map()) 是正常操作
py asyncio.gather(x for a) 也一样
DOM 简直是UI UX 的天堂,我都不知道 Java 里还要手动定义阻塞线程(Disptacher)的 async 操作里
无所谓,反正标准库不会带,AI也不会写..
在 JavaScript 中,你可以使用 GPUBuffer.mapAsync() 方法来映射 GPUBuffer 的一部分,并且返回一个 Promise1。
在 Akka Streams 中,你可以使用 Source.mapAsync 或 Flow.mapAsync 来并发地运行多个 Future,并且保持元素的顺序2。
在 Python 中,你可以使用 multiprocessing.Pool.map_async 来非阻塞地运行多个进程,并且返回一个 AsyncResult3。
我误会 Python 了,虽然 asyncio 臭名远扬,
gather,wait,as_completed 在理论上比 Promise.all,race,any 准确
但是这种准确.. 真的不如js,至少有两个是保底记得住的
py可能还是败在箭头函数不好写,以及没有 libuv.org 那么异步的系统IO可攀,虽然 yield 是和js一样方便的,没有DOM那种免线程框架还是做不起来
Koshin:
平常写Android 业务的来说,基本这种就够了,我只在处理比较长的初始化流程用的上async
Yumeko:
在学dsl,是每创建一个方法都要存一个属性吗,不然好像没法用
Jason5Lee:
我甚至希望 HTML 本身就长这样(
duangsuse:
不过我最近打草稿的 JS 框架就是这样
所以之前我被冰封骂“胡乱加功能导致可维护性崩坏” 的时候,我就觉得我很冤啊。 我是最重视优雅性的,甚至为此了搁置了实践
SQL 和ORM(Repo, Mapper 那些的)现在就是绝对的基本功, 根本没有淘汰一说, 但未来会有更多利用新数据库的需求,甚至pg 最近也支持了向量类型。SQL凭什么淘汰别人的新功能呢?
其实这个主要是修正了语序、 where 子句冗长的问题,然后是本土化了「序大 序小(升降序) 页每」
有用表T 是用来给 取; 做简写的,现在我觉得应该直接把上次查询的表设为 T ,就像 IPython 的_变量;主打一个避免Tab补齐
isekiのChannel:
where 子句的冗长,你是指 且 或 这样的连接词吗
duangsuse:
呃.. 当时没有,但现在觉得是
当时连 left join 都不知道是啥(当然现在也不知道)。。
不过发现 SQL 能查询出 Madelbrot 集(把xy值插进去 select +递归) 也是很震惊
SQL 既然是关系式语言,就要遵守 Pair(a,b), a=1, b=2 | b=3 这样的逻辑写法;虽然看起来没有隐式 this ,查询会有冗余变量
当时就觉得是 filterMap 那一套呗
根本不科学,因为程序员是没日没夜在说这些 select ,正常人怎么会?
如果一切都能用 UI 解决,那现在许多后端直接变成带验证公式的 Excel 好了;但是还是有人 既要可读 又要可用
Science Yuan:
所以你到底哪里超越了SQL
ORM的好处显然就是它是嵌入宿主语言的
duangsuse:
行了吧,我没想过超越谁,你就当那是玩具好了。 俺不是程序员照样活得开心
大学时第一次应聘一个连锁药店,就看到 1000+行的存储过程SQL
感觉也是.. 隔行如隔山?
我觉得 OpenResty 也是栽在Lua没有IDE上
ties 是指 sorted list[N] 里,第N项后相同的项 ,这有什么用,是数 NULL 的?
应该是 group by 的单分组形式?
ties 第N项后相同的项.. 没见过这种处理
所以我不太会SQL ,因为一堆无法情景实例化的语法
Haskell 里的 takeWhile (==) ,或者说 [1,1,2,3].firsts(1) 可以做到 ties ,不过有点难;所以说 SQL tie 比 Kotlin 那30+列表处理 fun 还先进(
其实在我眼中,有这么多 List/Iter 函数,说明标准库对多态和type 的归类和利用是失败的。就只差步 Ruby 的后尘了,rb 的 str.replace 是单参的。
Ruby 的时代开发出了 GitHub 欸,现在许多 DSL, Compose 也并不是从 Py 学来的,Ruby 是把内嵌DSL发扬光大了,比如它的 def 里可以嵌套 class..
一个语言失败,并不是坏事。反正工程师又不挑…… 而且垃圾语言,说不定高逼格大牛多、薪水会高
Go 的有些地方真的挺好,比如内建的 template 和 go func, 以及最好的 encoding/xml,json,protobuf,. 封装
在 UNIX 编程上,算是成功的吧
现在 protobuf 可以转为 json, 也能输出 Schema ,写起来有补齐
还是 Kotlin 协程好, 直接把调度器和 Continuation(return的函数化)放一块了,能在指定线程回调,能yieldAll,能支持结构化并发,同生同灭;JS就没有
可惜就是对框架开发者不好理解, 而且有点难记 launch, with啥的
八重 狐子:
压根没用过kt的async
直接整个函数变suspend
duangsuse:
=async {}不是可以用推导吗
Scope 上不会不兼容吗? 虽然 async 里应该能调 suspend
协程就是把 return的函数化 传给被调方,从而在堆里维持调用栈,也就是受try,while等流控支持的回调
js 里用 await Promise((ok)=> 就能拿到这个函续值了
但是 kt 里函续会在特定的 Dispatcher 上文被调用
那样是建立新线程等待?
对了,那async{} 都不会卡在主调度器上? jvm好像没有单纯要回调,但不会卡线程的http,timer 啥的
nio.Unsafe 里的键盘 Signal 是不需要,也不会打断mainloop
八重 狐子:
因为我把那个function 直接suspend了
kt的async还真没怎么用过
duangsuse:
#bing
async{} 会返回一个 Deferred<T> 对象,表示协程的结果,可以通过调用 await() 方法
async{} 可以用来实现并发,即在同一个协程作用域中同时运行多个协程,并且等待它们的结果。
launch{} 则只是用来实现异步,即在后台运行协程,不需要等待它的结果1。
协程需要返回结果或并发,那么 async 可能更合适。 所以 async 只是用来延迟执行分组协程的?
延迟且有结果的 launch? 那和 ES6 async()=> 不一样啊, es6 没有说async是否并发吧..
好吧,是我理解有误 😅
isekiのChannel:
我这边写出的操蛋代码都长这样了: input.map{ async{ handle(it) } }.awaitAll()
duangsuse:
Promise.all(a.map()) 是正常操作
py asyncio.gather(x for a) 也一样
DOM 简直是UI UX 的天堂,我都不知道 Java 里还要手动定义阻塞线程(Disptacher)的 async 操作里
无所谓,反正标准库不会带,AI也不会写..
在 JavaScript 中,你可以使用 GPUBuffer.mapAsync() 方法来映射 GPUBuffer 的一部分,并且返回一个 Promise1。
在 Akka Streams 中,你可以使用 Source.mapAsync 或 Flow.mapAsync 来并发地运行多个 Future,并且保持元素的顺序2。
在 Python 中,你可以使用 multiprocessing.Pool.map_async 来非阻塞地运行多个进程,并且返回一个 AsyncResult3。
我误会 Python 了,虽然 asyncio 臭名远扬,
gather,wait,as_completed 在理论上比 Promise.all,race,any 准确
但是这种准确.. 真的不如js,至少有两个是保底记得住的
py可能还是败在箭头函数不好写,以及没有 libuv.org 那么异步的系统IO可攀,虽然 yield 是和js一样方便的,没有DOM那种免线程框架还是做不起来
Koshin:
平常写Android 业务的来说,基本这种就够了,我只在处理比较长的初始化流程用的上async
Yumeko:
在学dsl,是每创建一个方法都要存一个属性吗,不然好像没法用
Jason5Lee:
我甚至希望 HTML 本身就长这样(
duangsuse:
不过我最近打草稿的 JS 框架就是这样
Forwarded from dnaugsuz
#bing #py 移植到 scipy 和 cv2:
# wav2rawpng.sh—失败
infile=$1
sox -r 44100 -b 16 -c 2 $infile -e unsigned -b 16 -c 2 test.raw
file=test.rgb
mv test.raw $file
# find out size in bytes
size=$(du -b $file)
echo size in bytes is $size
# calculate padding needed to ensure square image
# I don't even know what's going on with the 6's...
pad=$(awk -v size="$size" 'function quad(x){return(x*x)} function ceil(x, y){y=int(x); return(x>y?y+1:y)} BEGIN{ print quad(6*ceil(sqrt(size/6)))/6-size }')
echo padding in bytes is $pad
cp test.rgb test-pad.rgb
truncate -s +$pad test-pad.rgb
# oh yeah we need the resolution too
newedge=$(awk -v size="$size" 'function ceil(x, y){y=int(x); return(x>y?y+1:y)} BEGIN{ print ceil(sqrt(size/6)) }')
echo edge size is $newedge
magick convert -size ${newedge}x${newedge} -depth 16 test-pad.rgb ${infile%.wav}-rawpng.png
from scipy.io import wavfile
from PIL import Image
import numpy as np
rate, aud = wavfile.read('a.wav')
# Compute the minimum square dimension
l = int(np.ceil(np.sqrt(aud.size / 6)))
pad = int((l ** 2) * 6 - aud.size)
# Reshape the aud array into a square image
img = np.pad(aud, (0, pad), constant_values=0)
img = Image.fromarray(img.reshape(l, l, -1),'RGB')
img
import IPython.display as say
aud = np.array(img).reshape(-1)
aud = aud[:aud.size - pad]
wavfile.write('a1.wav', rate, aud)
say.Audio('a.wav')#py #code #FP w2png diff
from PIL import \
Image ,\
ImageFilter as Filt
import \
librosa as sa, soundfile ,\
numpy as np ,\
functools as Fns
pipe=lambda*eq:Fns.reduce(lambda a,b:\
(lambda x:b[0](a[0](x)), lambda y:a[1](b[1](y))), eq)
def main():
cat,cut=w2bmp('a.wav') #v use blur(3px) on audio?
a=cat('out_'); cut(a)
b=cat('fi_').filter(Filt.GaussianBlur(radius=3)); cut(b)
display(a,b)
w2bmp=lambda fp:pipe(wav(fp), ft, (svA,svB), (np.flipud,np.flipud), bmp('HSV') )
def wav(f,sr=48000,ver=''):
def to(v): nonlocal ver;ver=v; return sa.load(f, sr=sr)[0]
return to, lambda y: soundfile.write(ver+f,y, sr,'PCM_16')
# A:w2bmp, B:bmp2w
bmp=lambda rgb: (
lambda A:Image.fromarray(A, mode=rgb).convert("RGB"),
lambda B:np.array(B.convert(rgb))
)
yMax,yPad=300,lambda x:np.pad(x, [(0, 1025-yMax)], 'constant')
ft=(lambda A:(F:=sa.stft(A)[:yMax], (np.abs(F),np.angle(F)) )[-1] ,\
lambda B:(lambda V,S:sa.istft(V * np.exp(1j * S)) )(*map(yPad,B)) )
def svA(A):
V,S=A; H=np.full(V.shape,0) # 0, power, phase
return np.dstack((H, S, V)).astype(np.uint8)
def svB(B):
H,S,V=(px[...,0] for px in np.dsplit(B,3))
return V,S
def main():
cat,cut=w2bmp, bmp2w
a=cat(); cut('out_',a)
b=a.filter(Filt.GaussianBlur(radius=3)); cut('fi_',b)
display(a,b)
# A:w2bmp, B:bmp2w
fp='a.wav'
sr=48000
yMax,yPad=300,lambda x:np.pad(x, [(0, 1025-yMax)], 'constant')
def w2bmp(): # 所以,你要在两个函数里涉及文件 read-write
A=sa.load(fp, sr=sr)[0]
F=sa.stft(A)[:yMax]
A=svA((np.abs(F),np.angle(F)))
A=Image.fromarray(A, mode="HSV").convert("RGB")
return A
def bmp2w(ver, B):
B=np.array(B.convert("HSV"))
V,S=map(yPad,svB(B))
B=sa.istft(V * np.exp(1j * S))
soundfile.write(ver+fp,B, sr,'PCM_16')
duangsues.is_a? SaltedFish
https://react.dev/blog/2023/03/16/introducing-react-dev 也写了 ee.Counter=({n=0})=>button( wOp({tap(){ n.v++ }}), Eq.fmt`pressed ${n}time$` //这样支持SSR或爬取 ) ee.Inp=({v="", isOk=$Y})=>html( input(wKV({v}) ) p(Eq.fmt`You typed: ${v}`), btn(Reset=>{v.v=""})…
ee.main=({name='world'})=>
h1(html`Hello ${name}!`)
ee.main=({src='rick.gif', name='Rick Astley'})=>
img(wKV({src, alt:html`${name} dancing`}))
ee.main=({n:0, hov})=>
button(
wSty({ $wtf: hov })
wOp({
tap(){ n.v+=1 }, hov
}, 'only'), //preventDefault
html`Clicked ${n}time$`
)
ee.main=({a=rn(0,10), b=a, c})=>(
Eq.at(c,{a,b}, _=>a+b),
div(
sel(a), sel(b),
p(html`${a}+${b}=${c}`)
)
)
ee.main=({n=0, n2,n4,sec}, my)=>(
Eq.at(n2, {n}, _=>n*2),
my.stop=CSS.s(0.5).rate(()=> n.v+=1),
div(
button(
wOp({tap: my.stop})
),
p(html`${n}*2=${n2}`),
p(html`${n2}*2=${n2(x=>x*2)}`)
)
)
ee.main=({n=0})=>(
Eq.at(n,{n}, _=>{
if(n>=10){ say(`count too high!`); return 9 }
})
button(
wOp({
click(ev){ n.v++ }
}),
html`Clicked ${n}time$`
)
)
ee.main=({t=0.})=>
html(
efx(t, {dur:400, ease:'k3'}),
progress(wKV({value: t})),
...rn(0,1, 1/4).lets(t=>button(
wOp({tap(){t.v=t}}),
html`${t}%`
))
)
ee.main=({vis=$Y})=>
html(
sel(vis),
p(efx(vis, {erase:{fly:{y:200,dur:2..s}, fade:{dt:.1} }}),
`in:fly out:fade`)
)
// 组件化
ee.main=()=>p(`Styled~`)
Nd.unit(CSS=>{
wSty("app")
wSty.p={
color: purple,
font: {
family: ['Comic Sans MS', cursive],
size: 2..em
}
}
})
ee.main=({it})=>(
wSty(it, "app"),
p(`These styles`, Nested())
)
ee.Nested=()=>
p(`...don't affect me `, html(`<u>here ULine</u>`))
ee.main=({})=>NeedKV(wKV({answer:42}))
ee.NeedKV=({ask:{answer}})=>
p(html`Universe is ${answer||'a mystery'}`)
const pkgs=[
{
name: 'svelte', ver: 3,
href: 'https://svelte.dev'
speed: 'blazing fast',
}
]
ee.main=()=>lets(pkgs, Info)
ee.Info=({name,ver,href,speed})=>p(html`
The ${code(name)} is ${speed}.
Get v${ver} from ${a(['',html`http:${name}`], `npm`)}
and ${a(['',href], `learn more here`)}
`)
//逻辑
ee.main=({
login=NO
})=>
when(login, {
$Y: btn(LogOut=>{ login.v^=1 }),
$N: btn(LogIn =>{ login.v^=1 }),
})
ee.main=({
x=7
})=>div(wOp({edit:$Y}),
when(x (x=>[x>10, x<5, $Y] ), [
p(html`${x} > 10`),
p(html`${x} < 5`),
p(html`${x} in rn(6,9)`),
]),
mark(wOp({edit:NO}), 'Truth: ',x, error)
)
let cats = [
{ id: 'J---aiyznGQ', name: 'Keyboard Cat' },
{ id: 'z_AbfPXTKms', name: 'Maru' },
{ id: 'OUtn3pvWmpg', name: 'Henri The Existential Cat' }
];
ee.main=()=>$app(
h1(`The Famous Cats of YouTube`),
lets(cats, ({id,name},i)=>
li(a(['',html`yt:${id}`,'_blank'], html`${i(Eq.num(+1))}: ${name}` ))
, ul(`empty?`))
)
let things = is.w`darkblue indigo deeppink salmon gold`.lets(
(x,id)=>({id,color:x}))
ee.main=()=>
html(
btn(Pop0=>{ things.splice(0,1) }),
grid({of:'1fr,2', gap:'1em'},
...['id',NO].lets(k=>
div(h2(`Key ${k}`),
lets(things.let({sort: k}), Thing)
)
)
)
)
duangsues.is_a? SaltedFish
ee.main=({name='world'})=> h1(html`Hello ${name}!`) ee.main=({src='rick.gif', name='Rick Astley'})=> img(wKV({src, alt:html`${name} dancing`})) ee.main=({n:0, hov})=> button( wSty({ $wtf: hov }) wOp({ tap(){ n.v+=1 }, hov }, 'only'), //preventDefault…
//Events, no forwarding indeed
ee.main=()=>html(
wOp({msg(ev) {ee.say(ev.text)} })
Inner({})
)
ee.Inner=({it})=>(
wOp(it.super={msg:1 }),
btn(sayHello=>{ it.super.msg({text:'morning!'}) })
)
ee.main=({d,time})=>(
Eq.at([d,time], [1..s.rate], ([t])=>[new Date, t]),
h1(html`Time is ${d}h24,${[,,,0,2,2]}`)
)
ee.main=({P=N2(0,0)})=>$full(
N2.ptr(P),
html`mouse @ ${P.x}y${P.y}`
)
ee.main=({x=0,y=0, k='client'})=>$full(
wOp({mousemove(ev) { x.v=ev[k.v+'X']; y.v=ev[k.v+'Y'] } }),
wOp({tap(){ee.say('Only once') } }, 'once'),
html`mouse @ ${x}y${y}`
)
api=ee.HI('tutorial/', {
'*':({text,ok})=> ok? text : Error(text)
})
ee.main=({F5})=>
html(
button(wOp({tap:F5}), `load Num`),
Reload({},
lets({load:[F5,api.random_number]}, x=>html`Rand num is: ${x}`)
)
ee.main=({F5})=>html(
button(wOp({tap:F5}), `load Num`),
Reload(
{load:p(`..Wait`),fail:p(wSty({fg:'red'}), error)},
lets({async*load() {
for(;; await F5) yield api.random_number()
}},
x=>html`Rand num is: ${x}`)
)
)
api=ee.HI('https://jsonplaceholder.typicode.com/', {
photos(x,{_limit}){}
})
ee.Photos=()=>
html(
h1(`Photos`),
grid({of: '5,1fr', gap:8}, wSty`full`,
lets({load:()=> api.photos(20) },
({thumbnailUrl:src, title:alt})=>figure(
img(wKV({src,alt})), figcaption(alt)
))
)
)
ee.main=({size=42, text='god', L})=>
html(
sel(size), sel(text),
p(html`size: ${L.x} h ${L.y}`),
div(
wKV({ xy:[0,L, 'absolute!'] }),
span(wSty({font:{size} }), text)
)
)
//Form
let active=a=>a.only({done:$N})
ee.main=({
todos=is.wdoc`
rewrite Svelte
build TODO app
adopt AI
`.split('\n').lets(x=> ({done:$N, text:x}))
})=>
html(
h1(`Todos`),
lets(todos, x=>div(wKV({show:x.done(q=>!q) })
sel(x.done), sel(x.text, {tip:`Do what?`})
)),
p(html`${todos([active,n])} remaining`),
btn(Add=>{ todos.add({done:$N,text:''}) }, Clear=>{ todos.let(active) ) })
)
ee.main=({pin=''})=>
html(
h1(wSty({ fg:pin(q=>q? '#333':'#ccc') }),
pin(x=>x? x.replace(/.(?!$)/g, '•') : 'pls enter' )),
Keypad({pin}, {submit:alert})
)
ee.Keypad=({pin}, my,
btr=(tap)=>button(wKV({show:pin(x=>!x)}), wOp({tap}))
)=>
grid({of:'3,5em 4,3em', gap:'.5em'},
wOp({of: 'button',
tap(){ pin.v+=this.innerText }
})
...rn(1,9).lets(x=>button(x)),
btr(()=> pin.v=''),
button(0),
btr(my.submit)
)
ee.main=({
name='',
ten=rn(0,10),
a=[1,ten],b=[2,ten],c,
yes=$N,
flavors=[['Mint choc chip'], menu],
scoops=[0, is.w`One Two Three`.lets(x=>x+' scoops')],
order='',
text='my **dear** Python'
})=>(
Eq.at(c, {a,b},_=>a+b),
Eq.at(order, {flavors,scoops},_=>
n(flavors)==0? 'need more!'
:n(flavors)>scoops? 'more scoops!'
:html`Ordered ${scoops}scoop$ of ${flavors}`.v
),
html(
sel(name,{tip:`enter your name`}), p(html`Helo ${name (x=>x||'stranger') }`),
sel(a, {chk:1}), sel(a),
sel(b, {chk:1}), sel(b),
p(html`${a}+${b} = ${c}`),
sel(yes),
when(yes,
{$Y: p(`Good boy!`),
$N: p(`Bad !! must be checked`) })
button(wKV({show:yes}), `Get Food`),
h2(`Size`), sel(scoops)
h2(`Flavors`), sel(flavors, {of:'many',chk:1}), // of:'' = select[multiple?]
order,
textarea(wKV({value: text}), wSty({width:'100%', height:200 })),
html(text(marked))
)
)
is.use`marked elizabot.Eliza`
let menu = [
'Cookies and cream',
'Mint choc chip',
'Raspberry ripple'
]
Rn.ptr
await 0..s
String.it({
swapcase(_) {
/[a-z]/.test(_)? toUpperCase():toLowerCase()
}
})
删掉了my参数,允许用 ee.fork 定义私有组件、直接添加原型链扩展。爽了,减少了UI设计的噪音
ee.Demo=({n=0, ptr,P}, fmt=({x,y})=>html`(${x},${y})` )=>
div(
wOp({ mousemove:ev=>ptr }), N2.ptr(P), ()=>其他初始化绑定,
btn(n, [html`++ ${n.to(x=>x+1)}time$`])
, b(wOp({tap:n.to(Eq.num(-1))}), `n--`)
p(ptr(fmt)),
li(P(fmt))
)
let localUI=ee.fork
ee.Demo.it({
__n1:_=> _.n+1,
n: Eq(x=>x+1)
})我把文章的 #ts #Rust 代码重写了下
Array 具名?元组,组 when-as,Ln<Str>
Tree union-和类型 when- HtmlNode
Value 具名?泛型 'T'type Ln, Any
for和递归 类型的归纳 'this'type Num
if和匹配 trait重写 - Str as() Int
签名 trait Fn<R> (编译期计算)
实现 impl Fn forT
调用 T as F<>::Out
when- as动|静|绝句
Automobile'wheels seats manufacturer'(:Cnt1, manu_:Str)
- main
Automobile(4,4,"X"):
say("My car has ${wheels} wheels and ${seats} seats, and it was made by ${manufacturer}.")
when- MyCar
Wheels Seats Manfus
- main
at car=[4 4 "X"].Ary
car[MyCar.Seats.id].as<Int>
“没什么语法把名字给编号,和类型对应,但 T() Send 可以实现T,Ln<Any>转换”
-! main
PairN<Cnt1 Cnt1 Str>([4 4 X]):[[Wheels Seats Manfus]]
Wheels
pkg @RowAsData
“tag和强转的就不写了,太智障。
struct True,False 的也算了,编译期计算没必要写成类型匹配”
when- Expr
Const(:Int)
Op(:Opk, A:Expr, B:Expr)
when- Opk
+ - * /
- +(e:Expr) = when e:
Const(x):x
Op(k,A,B): (+A to +B):
when k:
+: A+B
- main
at e: Expr = (+, (53), (-, (1), (0) ))
say(+e)
'AB'(get)when- Either
A(:A) B(:B)
at xx: Either.A<Int>
xx.as<Either<Int Any?>>
“data Nat = Z | S Nat deriving Eq ”
when- Nat
Z S(:Nat)
- +(:Nat) = when nat:
Z: this
S(x): S(this)+x
- + 'ab'(:Nat) = when a to b:
Z to n: n
S(x) to n: x+S(n)
- main
at:
one S(Z)
three (1~3) (Nat: Sum(Z,S))
one+three
-! printf(fmt:Str) = Fn1<Arg<Any>>{}.as<Fn>
^now
-! Fn = Type: “constexpr, TypeFamilies”
FnN(fmt('\\d'):Int )
Array 具名?元组,组 when-as,Ln<Str>
Tree union-和类型 when- HtmlNode
Value 具名?泛型 'T'type Ln, Any
for和递归 类型的归纳 'this'type Num
if和匹配 trait重写 - Str as() Int
签名 trait Fn<R> (编译期计算)
实现 impl Fn forT
调用 T as F<>::Out