返回首页

Shik 用于 REPL 管道的语言

Shik — 终端中 REPL 和任务自动化的极简语言。基于 Lisp/Haskell 的语法带有管道和柯里化,简化文件和数据处理。与 bash、Python、Fish 的比较。

Shik:为什么需要一种新的终端脚本语言
Advertisement 728x90

Shik:专为终端管道和 REPL 设计的极简语言

在文件中搜索字符串或统计项目行数这类任务,往往需要串联各种工具,但它们的 API 却不统一。Bash 让你不得不在 [ -f ][[ -f ]]grep -qgrep -l 之间纠结,还要为文件名中的空格烦恼。Python 的文件操作散落在 osshutilpathlib 中。像 Nushell 这样的 Shell 专注于结构化数据,但在简洁脚本上仍有不足。

Shik 是一种受 Lisp 和 Haskell 启发的语言,专为 REPL 和自动化任务量身打造。其语法围绕空格应用函数、$> 管道和 #> 组合展开。

示例:从 Bash 到 Shik

查找包含 "- links" 的文件并移动到 topics/ 目录:

Google AdInline article slot

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)

仅四步管道,无需导入,无外部命令。

Google AdInline article slot

统计 .rs 文件的行数:

file.glob :./src/**/*.rs $>
  list.map (file.read #> string.lines #> list.len) $>
  list.sum $>
  print

管道从左到右流动数据,柯里化简化部分应用。

核心设计:Lisp 遇上 Haskell

一切皆函数。+ 1 2list.mapfile.glob —— 调用方式完全统一。空格应用函数;单参数无需括号。

Google AdInline article slot

四个关键操作符:

  • 空格:f x
  • #>:组合 f #> gfn [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

Advertisement 728x90

继续阅读