Shik:专为终端管道和 REPL 设计的极简语言
在文件中搜索字符串或统计项目行数这类任务,往往需要串联各种工具,但它们的 API 却不统一。Bash 让你不得不在 [ -f ] 和 [[ -f ]]、 grep -q 和 grep -l 之间纠结,还要为文件名中的空格烦恼。Python 的文件操作散落在 os、shutil 和 pathlib 中。像 Nushell 这样的 Shell 专注于结构化数据,但在简洁脚本上仍有不足。
Shik 是一种受 Lisp 和 Haskell 启发的语言,专为 REPL 和自动化任务量身打造。其语法围绕空格应用函数、$> 管道和 #> 组合展开。
示例:从 Bash 到 Shik
查找包含 "- links" 的文件并移动到 topics/ 目录:
Bash: 5 行代码,充满 grep 标志陷阱和引号头疼问题。
Shik:
file.glob :./* $>
list.filter file.is-file $>
list.filter (fn [f] file.read f $> string.has "- links") $>
list.iterate (file.move :topics)
仅四步管道,无需导入,无外部命令。
统计 .rs 文件的行数:
file.glob :./src/**/*.rs $>
list.map (file.read #> string.lines #> list.len) $>
list.sum $>
print
管道从左到右流动数据,柯里化简化部分应用。
核心设计:Lisp 遇上 Haskell
一切皆函数。+ 1 2、list.map、file.glob —— 调用方式完全统一。空格应用函数;单参数无需括号。
四个关键操作符:
- 空格:
f x #>:组合f #> g→fn [x] g (f x)$:低优先级应用print $ + 1 2$>:管道x $> f
自动柯里化:(+ 1) 变成“加 1”的函数。参数顺序:第一个参数是固定修饰符。
let lst [1 2 3 4]
lst $> list.map (+ 1) ; [2 3 4 5]
lst $> list.map (* 2) ; [2 4 6 8]
统一的算术运算,无需 flip。
语法速查表:5 分钟上手
字面量:
42 ; 数字
"hello" ; 字符串
:hello ; 符号(无空格)
[1 2 3] ; 列表
{:name :Alice} ; 对象
fn [arg] body ; 函数
变量:
let name :Alice
let greet fn [name] "Hello, {name}!"
print $ greet name
set x (+ x 5) ; 突变
字符串插值用 {expr}。点号是名称一部分:string.+、file.read。
内置函数: file.、list.、string.、shell. 开箱即用。REPL 中 help list.map 显示文档。
终端人体工程学
无语句与表达式的区分 —— 一切皆表达式。只有数据和全局函数,无类/方法。在纯 REPL 中测试,无需方向键。
管道 $> 消除嵌套:
无管道: print (list.sum (list.map ...)) —— 一团乱。
有管道: 数据从左到右流动,线性可读。
用 let 的柯里化示例:
let add-one (+ 1)
let files-with-links (fn [dir] file.glob dir $> list.filter (file.read #> string.has "- links"))
核心特性
- 统一的函数应用,语法学习成本最低。
- 管道
$>和柯里化,实现无嵌套数据链。 - 内置
file.、list.、string.—— 无需导入。 - REPL 优先:
help、符号:、插值{}。 - 参数顺序:首位为修饰符,便于部分应用。
— Editorial Team
暂无评论。