Skip to content

awsl-project/redbook_lang

Repository files navigation

📜 RedbookLang (薯言) 编程语言文档

本项目所有代码均由 AI 生成,未经人工审核。请谨慎使用。

欢迎来到 RedbookLang(薯言) 的世界!

这是一个全新的编程语言,旨在让编程变得更简单、更有趣。

它的语法灵感来源于 Redbook 社区的交流方式,使用了许多通俗易懂的表达方式。

下面是 RedbookLang 的基本语法和功能介绍。

1. 基础

  • 注释 (Comments): 使用 # 符号开始一行注释。注释内容会被解释器忽略。
# 这是一行注释,解释器会忽略我哦
  • 大小写 (Case Sensitivity): RedbookLang 中的关键字和用双引号包裹的标识符(如变量名、函数名)是区分其实际内容的,但关键字本身(如 种草一个, 听我说,)必须按照文档中指定的大小写来书写。

  • 语句体 (Statement Bodies): 重要提示: 当前版本的 RedbookLang 中,函数定义、条件语句 (康康是不是, 或者康康, 都不是呢)以及循环语句 (本宝宝坚持, 盘点清单) 的执行体都只能包含 单个语句

2. 数据类型 (Data Types)

RedbookLang 目前支持以下主要数据类型:

  • 数值 (Number): 包括整数和浮点数。负数可以通过在数字前加上 - (负号) 来表示 (技术上这是一个一元运算符作用于数字)。

    10
    3.14
    -7
    
  • 字符串 (String): 用单引号 '' 包裹的文本。支持空字符串(如 '')。

    '你好, RedbookLang!'
    '今天天气真不错☀️'
    ''
    
  • 布尔值 (Boolean): 代表逻辑真或假。

    • 当然啦 (代表 真 / True)
    • 才不是 (代表 假 / False)
    种草一个 "事实" 是 当然啦
    种草一个 "谣言" 是 才不是
    
  • 列表 (List): 用方括号 [] 包裹,元素用逗号分隔。可包含任意类型。使用方括号和从 0 开始的数字索引 [0] 来访问元素。

    种草一个 "我的列表" 是 [1, 'a', 当然啦]
    听我说, "我的列表"[1] # 输出: a
    
  • 字典 (Dict): 用大括号 {} 包裹,是键值对的集合。键和值都可以是任意表达式。使用方括号和键 ['key'] 来访问元素。

    种草一个 "我的字典" 是 {'昵称': '小红薯', '年龄': 18}
    听我说, "我的字典"['年龄'] # 输出: 18
    

3. 变量 (Variables)

  • 声明和赋值 (Declaration and Assignment): 使用 种草一个 关键字声明变量,后跟用双引号 "" 包裹的变量名,然后是 关键字和赋给变量的值。

    种草一个 "我的变量" 是 100
    种草一个 "欢迎语" 是 'Hello, RedbookLang!'
    种草一个 "笔记赞数" 是 1024
    种草一个 "是否周末" 是 当然啦
    
  • 标识符 (Identifiers): 变量名和函数名等标识符,必须用双引号 "" 包裹。

    "myVar"
    "计算总价"
    "用户昵称"
    

4. 运算符 (Operators)

RedbookLang 支持多种运算符:

  • 算术运算符 (Arithmetic Operators):

    • 加上 (+): 数字加法,或字符串拼接。

      听我说, 10 加上 5         # 输出: 15
      听我说, '你好' 加上 '薯言' # 输出: 你好薯言
      
    • 减去 (-): 数字减法。

      听我说, 10 减去 5         # 输出: 5
      
    • 乘以 (*): 数字乘法。

      听我说, 10 乘以 5         # 输出: 50
      
    • 除以 (/): 数字除法。结果通常是浮点数。

      听我说, 10 除以 5         # 输出: 2.0
      听我说, 7 除以 2          # 输出: 3.5
      
    • 一元负号 (-): 用于表示负数或取一个数值表达式的负值。

      种草一个 "温度" 是 -5
      种草一个 "另一个数" 是 10
      听我说, -"另一个数"         # 输出: -10
      
  • 比较运算符 (Comparison Operators): 用于比较两个值,结果是布尔值 (当然啦才不是)。

    • 等于 (==)
    • 不等于 (!=)
    • 小于 (<)
    • 小于等于 (<=)
    • 大于 (>)
    • 大于等于 (>=)
    听我说, 10 等于 10       # 输出: True (实际输出可能是 当然啦 的等价值)
    听我说, '苹果' 不等于 '香蕉' # 输出: True
    听我说, 5 大于 3         # 输出: True
    

    Note: For <, <=, >, >= operators, comparing values of different types (e.g., a number and a string) may lead to a TypeError.

  • 逻辑运算符 (Logical Operators): 用于组合布尔表达式。

    • 并且 (AND): 如果两边的表达式都为真,则结果为真。
    • 或者 (OR): 如果两边的表达式至少有一个为真,则结果为真。
    • 反转魅力 (NOT): 对单个布尔表达式取反。
    种草一个 "阳光明媚" 是 当然啦
    种草一个 "周末" 是 才不是
    听我说, "阳光明媚" 并且 "周末"  # 输出: False
    听我说, "阳光明媚" 或者 "周末"  # 输出: True
    听我说, 反转魅力 "周末"         # 输出: True
    
  • 运算符优先级 (Operator Precedence): RedbookLang 遵循一定的运算顺序:

    1. 括号 () 内的表达式
    2. 一元运算符 (- 作为负号, 反转魅力)
    3. 乘法 乘以, 除法 除以
    4. 加法 加上, 减法 减去
    5. 比较运算符 (等于, 小于, 等)
    6. 逻辑与 并且
    7. 逻辑或 或者

    可以使用圆括号 () 来明确控制运算顺序。

    听我说, (10 加上 5) 乘以 2 # 输出: 30
    听我说, 反转魅力 ("阳光明媚" 并且 "周末") # 先算括号内,再取反
    

5. 控制流 (Control Flow)

RedbookLang 支持条件语句和循环语句来控制程序的执行流程。

  • 条件语句 (If-Else Statements): 使用 康康是不是或者康康都不是呢
    • 康康是不是 condition: statement

    • 或者康康 condition: statement (可选,可有多个)

    • 都不是呢: statement (可选) condition 是一个结果为布尔值的表达式。statement 是当条件满足时执行的单个语句。

      种草一个 "笔记点赞数" 是 250
      康康是不是 "笔记点赞数" 大于 500:
          听我说, '哇哦!笔记小爆款!'
      或者康康 "笔记点赞数" 大于 200:
          听我说, '不错哦,笔记有人气,继续加油!' # 这条会执行
      都不是呢:
          听我说, '每篇用心分享的笔记都是好笔记!💖'
      
    • While 循环 (本宝宝坚持): 当给定条件为真时,重复执行一个语句。

      • 本宝宝坚持 condition: statement condition 是一个布尔表达式。statement 是在每次循环中执行的单个语句。 为了防止无限循环,存在一个最大循环次数限制 (默认为2000次)。
      种草一个 "计数器" 是 0
      本宝宝坚持 "计数器" 小于 3:
          种草一个 "计数器" 是 "计数器" 加上 1
      听我说, '计数器最终值为:', "计数器" # 输出: 计数器最终值为: 3
      
    • For 循环 (盘点清单): 用于遍历一个数字序列。

      • 盘点清单 "iterator_var" (启动: start_expr, 目标: end_expr [, 跨步: step_expr]): statement
        • "iterator_var": 用双引号包裹的循环变量名。
        • 启动: start_expr: 循环的起始值 (包含)。
        • 目标: end_expr: 循环的结束边界。
          • 如果 跨步 为正,循环继续只要迭代变量 < end_expr
          • 如果 跨步 为负,循环继续只要迭代变量 > end_expr
        • 跨步: step_expr (可选): 每次循环的步长,默认为 1。步长不能为 0
        • start_expr, end_expr, step_expr 都必须是数值。 statement 是在每次循环中执行的单个语句。同样有最大循环次数限制。
      听我说, '* 正向盘点 *'
      盘点清单 "序号" (启动: 1, 目标: 4): # 序号: 1, 2, 3
          听我说, '当前序号是:', "序号"
      
      听我说, '* 反向盘点 (带步长) *'
      盘点清单 "倒计时" (启动: 5, 目标: 0, 跨步: -1): # 倒计时: 5, 4, 3, 2, 1
          听我说, '倒计时:', "倒计时"
      

6. 函数 (Functions)

函数是可重用的代码块。

  • 定义函数 (Defining Functions): 使用 开个新帖 关键字。

    • : 后跟用双引号 "" 包裹的函数名。

    • 艾特: 后跟圆括号 () 包裹的参数列表。参数名也用双引号 "" 包裹,多个参数用逗号 , 分隔。如果函数没有参数,则 () 中为空。

    • 函数体以冒号 : 开始,后跟函数执行的单个语句

    • 绝绝子: 用于从函数中返回值。

      开个新帖 叫 "加法大师" 艾特 ("数字一", "数字二"):
          绝绝子 "数字一" 加上 "数字二"
      
      开个新帖 叫 "简单问候" 艾特 (): # 无参数函数
          听我说, '你好呀, 薯宝宝!'
      
      开个新帖 叫 "个性化问候" 艾特 ("名字"):
          绝绝子 '你好呀, ' 加上 "名字" 加上 '!'
      
    • 调用函数 (Calling Functions): 使用 调用 关键字。

      • 后跟用双引号 "" 包裹的函数名。
      • : 后跟圆括号 () 包裹的参数值列表。多个参数值用逗号 , 分隔。如果调用无参函数,() 中为空。
      • 函数调用本身可以作为表达式使用。
      种草一个 "计算结果" 是 调用 "加法大师" 用 (15, 7)
      听我说, "计算结果" # 输出: 22
      
      调用 "简单问候" 用 () # 输出: 你好呀, 薯宝宝!
      
      种草一个 "问候语" 是 调用 "个性化问候" 用 ('小红薯')
      听我说, "问候语" # 输出: 你好呀, 小红薯!
      
    • 返回值 (Return Values): 函数体中 绝绝子 后面的表达式的值就是函数的返回值。如果函数没有 绝绝子 语句,或者 绝绝子 后面没有显式值,则函数不会返回一个可直接使用的值 (类似于其他语言中的 voidNone 返回,但在薯言中,你不能直接将这个“无返回值”赋给变量或打印它期待一个值)。

6. 运行时行为

  • 字符串字面量允许为空(如 ''),不会报错。
  • 列表字典可以作为变量赋值、打印输出、作为函数参数等,解释器会正确处理其运行时行为。
  • 列表和字典的嵌套、混合类型元素均被支持。

7. 输入/输出 (Input/Output)

  • 输出 (Output): 使用 听我说, 关键字打印一个或多个值到控制台。多个值用逗号 , 分隔,输出时它们会用单个空格隔开,并在末尾自动添加换行。

    听我说, '欢迎来到 RedbookLang!'
    种草一个 "年龄" 是 18
    听我说, '我的年龄是:', "年龄", '岁。' # 输出: 我的年龄是: 18 岁。
    

8. 错误处理 (Error Handling)

RedbookLang 会在遇到语法错误或运行时错误时给出中文提示。常见的错误类型包括:

  • SyntaxError: 词法分析或语法分析阶段发现代码不符合 RedbookLang 语法。例如,关键字写错,或者括号不匹配。
  • TypeError: 操作应用于了不兼容的类型。例如,用非数值类型进行 乘以 运算,或者对两个不同类型的值使用某些比较运算符。
  • NameError: 尝试使用一个未“种草”(定义)的标识符(变量或函数名)。
  • ZeroDivisionError: 尝试将一个数除以零。
  • ValueError: 传递给操作或函数的参数类型正确但值不合适。例如,盘点清单跨步 参数为零。
  • RuntimeError: 一般的运行时错误,例如循环次数超过了预设的最大限制。

9. 完整示例代码 (Comprehensive Example)

# RedbookLang (薯言) 来了! yyds!

听我说, '--- 基础变量和打印 ---'
种草一个 "我的昵称" 是 '薯条宝宝'
种草一个 "幸运数字" 是 -7 # 定义负数
听我说, "我的昵称", '的幸运数字是', "幸运数字"

听我说, '--- 列表(List) 和 字典(Dict) ---'
种草一个 "空列表" 是 []
种草一个 "数字列表" 是 [1, 2, 3]
种草一个 "混合列表" 是 ['a', 2, 当然啦]
听我说, "数字列表"
听我说, "混合列表"

种草一个 "空字典" 是 {}
种草一个 "信息" 是 {'昵称': '小红薯', '年龄': 18}
听我说, "信息"

听我说, '--- 访问列表和字典的元素 ---'
听我说, '数字列表的第一个元素是:', "数字列表"[0]
听我说, '信息的昵称是:', "信息"['昵称']

听我说, '--- 函数定义与调用 ---'
开个新帖 叫 "制作元气早餐" 艾特 ("主食", "饮品"):
    绝绝子 '元气早餐已上线:' 加上 "主食" 加上 ' + ' 加上 "饮品" 加上 ',开启美好一天!☀️'

种草一个 "我的早餐" 是 调用 "制作元气早餐" 用 ('小面包', '燕麦拿铁')
听我说, "我的早餐"

听我说, '--- 条件语句:康康是不是 ---'
种草一个 "笔记点赞数" 是 250
康康是不是 "笔记点赞数" 大于 500 并且 "幸运数字" 小于 0:
    听我说, '哇哦!笔记小爆款,而且今天幸运值拉满!'
或者康康 "笔记点赞数" 大于 200:
    听我说, '不错哦,笔记有人气,继续加油!' # <--- 这条会执行
都不是呢:
    听我说, '没关系,每篇用心分享的笔记都是好笔记!💖'

康康是不是 反转魅力 ("笔记点赞数" 等于 0): # not (点赞 == 0) -> 点赞 != 0
    听我说, '笔记已经有赞啦,不是零蛋宝宝!'

听我说, '--- 循环:本宝宝坚持 ---'
种草一个 "每日目标步数" 是 3
种草一个 "已走步数" 是 0
开个新帖 叫 "走一步" 艾特 ("当前步数"):
    绝绝子 "当前步数" 加上 1

本宝宝坚持 "已走步数" 小于 "每日目标步数":
    种草一个 "已走步数" 是 调用 "走一步" 用 ("已走步数")

听我说, '今日运动KPI完成,共走', "已走步数", '步!🏃‍♀️'

听我说, '--- 循环:盘点清单 (支持负数和负步长) ---'
开个新帖 叫 "分享第N个草稿" 艾特 ("草稿序号"):
    听我说, '正在编辑第', "草稿序号", '个草稿,快要完成了!'

听我说, '* 正向盘点 *'
盘点清单 "草稿ID" (启动: 1, 目标: 4): # 草稿ID: 1, 2, 3
    调用 "分享第N个草稿" 用 ("草稿ID")

听我说, '* 反向盘点 *'
盘点清单 "倒数日" (启动: 3, 目标: 0, 跨步: -1): # 倒数日: 3, 2, 1
    听我说, '距离 deadline 还有:', "倒数日", '天! 冲刺!'

种草一个 "我的起点" 是 -2
种草一个 "我的终点" 是 3
种草一个 "我的步调" 是 1
盘点清单 "负数测试" (启动: "我的起点", 目标: "我的终点", 跨步: "我的步调"): # -2, -1, 0, 1, 2
    听我说, '负数循环测试值:', "负数测试"

听我说, '--- 布尔与逻辑 ---'
种草一个 "今天下雨" 是 才不是
种草一个 "周末" 是 当然啦
康康是不是 "今天下雨" 或者 反转魅力 "周末": # false or not(true) -> false or false -> false
    听我说, '坏天气,宅家刷剧吧!'
都不是呢: # 这条会执行
    听我说, '天气不错,或者就是周末,出去玩!'

听我说, '--- 错误处理 ---'
# 试试错误处理
种草一个 "空篮子" 是 0
# 下面这行会触发 ZeroDivisionError,如果取消注释
# 听我说, 100 除以 "空篮子"
听我说, '代码执行完毕,感谢使用薯言!'

祝你使用 RedbookLang (薯言) 编程愉快!🎉

Releases

No releases published

Packages

 
 
 

Contributors