6 个版本

0.2.3 2024 年 8 月 4 日
0.2.2 2024 年 7 月 12 日
0.1.1 2024 年 7 月 9 日

263编程语言

Download history 350/week @ 2024-07-08 21/week @ 2024-07-15 16/week @ 2024-07-22 146/week @ 2024-07-29 22/week @ 2024-08-05 41/week @ 2024-08-12

每月 227 次下载

自定义许可证

87KB
2K SLoC

Spyglys

Spyglys 是一种简单的字符串处理解释型编程语言,最初是为 Sakinyje 设计的。总的来说,Spyglys 旨在嵌入到更大的程序中。

基本教程

一般信息

Spyglys 包含一个交互式外壳,可以通过 spyglys shell 命令访问。此命令接受一个额外的文件参数,可以用于将文件的全部内容导入作用域。

字符串用双引号 ("") 包围 正则表达式模式用单引号 ('') 包围

在 Spyglys 中,函数用于处理所有字符串操作。为了保持简单,函数始终只有一个参数,并且只有一个表达式来修改该参数。参数始终是正则表达式的类型,尽管这可以在定义内部用表达式构建。处理修改的表达式始终是字符串类型。函数使用 def 关键字定义,它们匹配的正则表达式模式放在括号之间。

def trim ('^\s*(?<main>\S(.*\S)?)\s*$'):
    main
end

函数的调用方式符合预期。

> trim("   hi   ")
=> "hi"

变量可以用于在多个函数之间共享定义。

let whitespace = '\s*';
let main = '(?<main>\S(.*\S)?)';

def trim ('^' + whitespace + main + whitespace + '$'):
    main
end

def trim_left ('^' + whitespace + main):
    main
end

def trim_right (main + whitespace + '$'):
    main
end

它们也可以是函数内部的字符串

let response = " sounds delicious";
def food_response ('I want some (?<food>.*)'):
    food + response
end

当函数不匹配模式时,它们将返回 EMPTY,这表示为 ()。这通常相当于空字符串。

> let response = food_response("I want to eat pasta");
> response
=> ()
> response + " right now."
=> " right now."

可以使用内置函数(使用 $function() 语法)处理空函数响应,这些函数可以接受多个参数。例如,前面的函数可以修改以包含默认食物。

let response = " sounds delicious";
def food_response ('I want some (food|(?<food>.+))'):
    $replace_empty(food, "cake") + response
end
> food_response("I want some pizza")
=> "pizza sounds delicious"
> food_response("I want some food")
=> "cake sounds delicious"

函数也可以是递归的。此函数将天真地递归地将 xml/html 转换为其等效的 s 表达式。

def parse_html ('<(?<tag>\w+)>(?<inner>(?<inner_html><.+)|.+)?</(?<secondtag>\w+)>'):
    "(" + tag + $replace_some(inner, " ") + $replace_some(inner, $if_else(inner_html, parse_html(inner), inner)) + ")"
end

待办事项

  • 文档
  • 更多测试
  • 新的语言功能

依赖关系

~4–14MB
~174K SLoC