打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

用户:LynChern/Sandbox:修订间差异

来自 LNN的:not(博客)?
LynChern留言 | 贡献
LynChern留言 | 贡献
 
(未显示2个用户的106个中间版本)
第1行: 第1行:
本页面分为两部分:如何实现特定效果,以及关于使用这些效果的样式指南。
===表白===


==测试场所==
我爱你[[用户:DGCK81LNN|LNN]]。千言万语汇集成简单表述,但我知道这是不够的。我不知道我能给你什么,但你填满了我(各种意义上)。你击碎了我为掩耳盗铃而筑起的高墙,温暖了我的心灵,让我感受到前所未有的关心与爱。我真希望能与你白头偕老。


如果您想在编辑时进行测试而不改变实际文章,可以在[[Esolang:Sandbox|沙盒]]中进行(请自行清理!)或者在[[Special:MyPage/Sandbox|您自己的沙盒]]中进行。要预览对文章的更改而不提交,请使用编辑视图底部的“显示预览”和“显示更改”按钮。
===任务===


==如何操作==
这是任务,要在此处的编辑工作:


===文本格式和组织===
* 设计基本的语法
* 完成分支模块的书写


使用两个单引号表示斜体:<nowiki>''fun''</nowiki> 生成 ''fun''。
===本文尚未完工!===


使用三个单引号表示粗体:<nowiki>'''Brainfuck'''</nowiki> 生成 '''Brainfuck'''。粗体应仅用于页面标题,且仅在该标题首次在文章中出现时使用。
该语言当前处于构想阶段,有较多内容还未完全确立。目前主要以概念形式表达,具体的语法正在设计。


使用两个等号表示章节:<nowiki>==计算能力==</nowiki>。使用三个等号表示子章节:<nowiki>===图灵等价===</nowiki>。
目前本文的书写方法有很多留空,这并不代表未来不会有具体的内容。


:缩进通过在行首添加冒号实现。
===本文格式===


===内部链接===
> 代表注释。在本文最终完工时,所有注释都会被移除。


使用两个方括号表示维基内部的链接:<nowiki>[[Brainfuck]]</nowiki> 生成 [[Brainfuck]]。
当注释被使用时,代表本段内容很可能在未来作出更改。


对于文章名称,所有名词我们都使用单数形式(Esolang: 命名空间中的除外)。MediaWiki很智能,所以这很容易:只需写 <nowiki>[[esoteric programming language]]s</nowiki>,你就会得到 [[esoteric programming language]]s。注意,尽管 "s" 在方括号外面,但它看起来仍像是链接的一部分。
=简介=


有时你需要更有创意,像这样:<nowiki>此类语言类似于 [[cellular automaton|cellular automata]]</nowiki>,这会生成:此类语言类似于 [[cellular automaton|cellular automata]]。文章名称区分大小写(所以不要链接到 "BrainFuck"),但 MediaWiki 会自动为您大写首字母。
xxx语是一门高级编程语言,声明式语言


===外部链接===
> 是的,我们连名字都未想好


对于外部链接,写 <nowiki>[http://whatever.the/urlis.html 页面描述]</nowiki>。外部链接应主要仅在文章底部的“外部资源”章节中使用。更多信息请参见下文。
==特点==


===预格式化代码===
==代码预览==


对于文本代码片段,在行首添加空格。它们将神奇地像这样分隔:
===[[Hello World]]===


  [-]    清空单元格
  我是代码
>+++++ 将下一个单元格设为 5。
[-<++>] 乘以 2
<.      打印换行符。


如果上述内容有任何不清楚的地方,您可以点击本页面的“编辑”查看。
===[[99 bottles of beer]]===


对于那些使用维基表格的人,我们的维基有一个特殊的 <code>plainpres</code> 类,它能使预格式化代码(如上所示,或使用显式的 <code>&lt;pre></code> 标签)在表格单元格中看起来更美观。用以下代码开始表格:
  我是代码
  <nowiki>{| class="wikitable plainpres"</nowiki>


<nowiki>{| class="wikitable plainpres"</nowiki>
===图灵完备证明===


有些深奥编程语言不易使用空格进行格式化,因此自然会产生由一整行组成的程序。或者你可能只是认为没有空格更符合语言的风格。无论如何,我们有一个 <code>rectwrap</code> 类,旨在允许此类代码在保持直边距的情况下很好地换行。使用方法如下:
该代码可以模拟一个[[]],证明了本语言是图灵完备的。
<nowiki><pre class="rectwrap">...你的代码放在这里...</pre></nowiki>
<pre class="rectwrap">
...你的代码放在这里...啊啊啊啊啊啊啊啊啊
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
啊啊啊啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥
啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥
啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥
啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥啥水水水水水水
水水水水水水水水水水水水水水水水水水水水水水水水水水水水
水水水水水水水水水水水水水水水水水水
</pre>


===分类===
> 这个章节不可能叫图灵完备证明,届时会更名为图灵机的名字。


您可以通过链接到某个分类来将内容添加到该分类中,通常放在页面末尾。所以,如果您想将文章放入“低级”分类,请在文章末尾添加 <nowiki>[[Category:Low-level]]</nowiki>。
我是代码


如果您想提供指向分类页面的普通链接,必须在分类前使用额外的冒号。<nowiki>[[:Category:Low-level]]</nowiki> 将生成 [[:Category:Low-level]]。
=运行xxx语程序=


关于特定语言的页面应''同时''添加到[[:Category:Languages]](如上所述)和[[语言列表]]页面(通过编辑后者)。
要运行使用xxx语编写的程序,预期的用途是将源代码作为编译器的输入,从而被编译成可执行的目标语言的代码。


另请参阅[[#Categorization|分类]]。
==Python编译器==


===列表===
将Python视为机器码的编译器。


最后,项目符号列表通过在连续的行首添加星号来创建。例如,“* 一件事”后面跟着“* 另一件事”再跟着“* 最后一件事”会生成:
<nowiki>[[解释器资源地址|Python实现]]</nowiki>


* 一件事
> 等待开发计划
* 另一件事
* 最后一件事


对于编号列表,做同样的事情,但以井号(更常被称为数字符号、英镑符号、主题标签或哈希符号,#)开始一行。例如,三个商业上最成功的[[深奥编程语言]]是:
==[[WhatLang]]编译器==


# [[Perl]]
将WhatLang视为机器码的编译器。
# [[Biota]]
# [[Brainfuck]]


===含有禁用字符的文章名称===
<nowiki>[[解释器资源地址|Python实现]]</nowiki>


有些字符不允许出现在文章名称中。这通常是 URL 中不允许的字符,如 <nowiki>?、[ 和 ]</nowiki>。例如,[[SMITH sharp|SMITH#]] 文章被命名为 ''SMITH sharp''。此类页面应在顶部包含 ''wrongtitle'' 模板。
> 等待开发计划


以下是添加 wrongtitle 模板的代码(以 SMITH# 为例):
==[[Bootstrapping]]==


<nowiki>{{wrongtitle|title=SMITH#}}</nowiki>
使用xxx语表达编译器程序不是该语言的强项,实现有一定难度。在一段时间内,语言的设计者认为没有必要开发。


这在页面上看起来会像这样:
=基本要素=


{{wrongtitle|title=SMITH#}}
让我们看一段xxx语[[#代码预览|代码]]。


对于名称应为小写的文章,在顶部放置 <nowiki>{{lowercase}}</nowiki> 以正确显示其标题。
xxx语的代码可使用的字符包含了:所有ASCII可见字符(包含空格)及《通用汉字规范表》中的所有汉字。


===在讨论页签名===
未指定字符所使用的编码。目前几个有效的编译器都能接受以UTF-8为的编码的纯文本文件作为源代码文件。理论上允许使用上述字符集以外的字符作为代码的一部分,但未处理任何特殊情况,可能发生未知的错误。


您可以通过输入 <nowiki>~~~~</nowiki> 来为您的帖子签名,这会自动替换为您的用户名、指向您用户页的链接以及时间和日期。在讨论页发表评论时请务必这样做。''仅''在讨论页发表评论时这样做。
xxx语的代码完全由以下这些要素构成:


您也可以使用编辑框上方的签名按钮,它会插入“<nowiki>--~~~~</nowiki>”。
* 关键字
* 标识符
* 字面量


===重定向===
xxx语的关键字包含了在其他语言中通常被称为运算符与结构符的词元。


有时,拥有一个自动将用户重定向到另一个页面的页面很有用。例如,文章 [[Brainf***]] [[BF]] 都会重定向到 [[Brainfuck]]。
xxx语的代码是大小写敏感的,这意味着<code>apple</code><code>Apple</code>不是同一个词元。


要创建自动重定向,请在要重定向的页面顶部插入以下代码:
xxx语对缩进不敏感。


<nowiki>#REDIRECT [[要重定向到的页面名称]]</nowiki>
> 目前还未设计如何区分关键字与标识符。可能会像[[wenyan|文言]]一样标识符有统一的特殊的格式,也可能像Python一样非关键字就是标识符。


===表格===
==xxx语标识符==
表格创建如下:
<nowiki>{| [class="wikitable, wikitable sortable"]</nowiki>
<nowiki>[! 标题 a !! 标题 b !! ...</nowiki>
<nowiki>|-]</nowiki>
<nowiki>| 条目 a || 条目 b || ...</nowiki>
<nowiki>|-</nowiki>
<nowiki>...</nowiki>
<nowiki>|}</nowiki>
[] 表示可选,多个选项用逗号分隔


===信息框===
标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。
信息框是一个整齐列出文章主题信息的框,它们显示在文章的右上角,以尽量减少对文本的干扰。<br>
用于语言的信息框语法如下:
{{infobox proglang
name=<文本>
paradigms=(命令式, 声明式, 函数式等)
author=<用户>
year=<整数>
class=(图灵完备, 下推自动机, 有限状态机等)
majorimpl=<语言>
influence=<语言>
influenced=<语言>
image=<图像文件>
}}
所有 key=value 对都是无序且可选的。


==何时操作==
xxx语的标识符的特点在于:


===强调===
* 第一点
* 第二点
* 第三点
* ...


'''粗体'''仅用于文章标题,且仅在其首次出现时使用。重要术语在首次出现时可以用''斜体''突出显示(除非它们重要到需要单独的文章,那样直接链接过去即可)。
> 额,我没设计好


===章节===
==xxx语关键字==


一般来说,请尽量少用子章节(尽管本帮助页面并非如此)。
> 这一段好像有点问题,因为这个语言可能没有关键字这样的概念


章节名称仅首字母大写。“Computational class”,而非“Computational Class”。
下面列出了xxx语中的关键字。关键字承担着赋予代码明确语义的重要能力,是语言中的核心词元。您不能将其作为常量、变量、类或任何标识符的名称。


===文章名称===
这些词元的具体作用会在下文逐步揭示。


大多数以名词命名的文章都应使用单数形式。例如,我们有一个名为[[cellular automaton]]的文章,讨论细胞自动机。
{| class="wikitable"
| entry a || entry b || entry c
|-
| entry a || entry b || entry c
|}


===外部链接===
下面列出了xxx语中的保留字。保留字是指在语言的发展中为未来可能会添加的新特性或语法结构而预先留出的词元。它们目前没有实际的语义功能,但为了保证代码在未来版本中的兼容性,您同样不能将保留字作为常量、变量、类或任何标识符的名称。


尽量将外部链接仅放在“外部资源”章节中。有时可能需要打破此规则,但仅限于偶尔。
{| class="wikitable"
| entry a || entry b || entry c
|-
| entry a || entry b || entry c
|}


该章节称为外部“资源”,而不是链接!说“链接”很傻;链接是展示功能,而我们链接到的资源才是重要的。
==xxx语字面量==


此章节应是一个列表。所以如果只有一个元素,请在它前面加上 *。
> todo


鉴于我们维基主题的性质,我们的外部链接通常是关于某个主题的唯一外部文档,并且有消失的趋势。'''请不要删除链接''',除非检查过是否有替代方案可用,例如页面已移动或有 Wayback Machine 上的缓存页面。[[:Template:Deadlink]](用于标记链接已过时)和[[:Template:Wayback]](用于以有用的格式链接到 Wayback)可帮助处理此问题。
===转义符===


===链接到用户页===
=数据类型=


一般来说,不要链接到用户页,但如果您有充分的理由这样做,请通过保留链接中的“User:”部分可见来使其显而易见(例如[[User:Graue]])。更多信息请参阅[[Esolang:Authors]]。
xxx语中有多种数据类型


===分类===
xxx语是强类型的,它不支持自动类型转换。如果要转换类型,必须通过调用标准库函数等方法显式地将数据进行类型转换。


[[Esolang:Categorization]] 提供了关于现有分类的信息。请不要在未于[[Esolang talk:Categorization]]讨论的情况下创建新分类。
==原子类型==


===沙盒使用===
===一、整型===


在[[Esolang:Sandbox]]有一个沙盒页面用于测试编辑。它几乎''从不''是准备新文章或模板的正确位置!相反,请将沙盒视为当编辑无法使用标准“显示预览”工具进行预览时的最后手段。大多数编辑者永远不需要此功能,可以放心忽略它,但在需要时它就在那里。
xxx语实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。
int
bool
char
enum


==另请参阅==
===二、浮点===


* [[Esolang:大胆编辑页面]],一项重要的编辑指南。
float
* [[Esolang:政策]],总结了深奥编程语言维基特有的政策。


==外部资源==
==结构类型==
* [[wikipedia:Help:Editing|维基百科编辑指南]]
 
===三、数组===
 
arrary
 
===四、类===
 
对象是类的实例
 
> todo
 
=声明与赋值=
 
声明是告诉编译器,应该以何种方式读取或写入数据,并为存储数据做准备,这个动作被称为分配内存地址。赋值,是将具体的内容填充到声明时已经分配好的内存地址。在声明时,还需要设置标识符,这是称呼这份数据的名字;在赋值后,就可以通过直接使用标识符,指代其对应的数据。
 
声明与赋值缺一不可,一个标识符只有在同时经历了声明和赋值之后,才能在代码中被正常使用。
 
整数 杯子 的值为 3
 
在这行代码中,<code>整数</code>指明了数据类型,<code>杯子</code>是具体的标识符,而<code>3</code>则是赋予该标识符的数据。
 
在声明时,如果不添加额外的关键字,那么在同一代码段内,您不能在下文再次声明或赋值同一个标识符,这样的数据也被称为常量。'''这意味着,xxx语默认声明的是常量。'''代码段的相关概念在后文介绍。
 
您可以先声明,然后再赋值。例如:
 
整数 杯子
杯子 的值为 3
 
上述的两种声明的写法都被称为显式声明。
 
xxx语支持自动类型推断。这意味着,您可以在不显式指明数据类型的情况下,直接给一个标识符赋值。编译器会根据赋给它的具体内容,自动推断出该标识符的数据类型并完成内存分配。这种写法也被称为隐式声明。
 
例如:
 
杯垫 的值为 5
 
在这行代码中,虽然我们没有写出代表整数类型的<code>整数</code>,但因为赋予的具体数据<code>5</code>是一个整数,编译器就会自动将<code>杯垫</code>推断为整数类型。在实际效果上,它与 <code>整数 杯垫 的值为 5</code> 是等价的。这种写法只是省去了指明数据类型,但不代表没有声明。这仍然是一行同时声明并赋值的代码。
 
=注释=
 
在计算机语言中,注释是计算机语言的一个重要组成部分,用于在源代码中解释代码的作用,可以增强程序的可读性、可维护性。
 
xxx语注释是一种在xxx语程序中用于提供代码功能说明的文本。
 
注释不会被编译器包含在最终的可执行文件中,因此不会对程序的运行结果产生任何影响。
 
在程序中经常注释是良好的编程习惯,它们帮助程序员更容易地理解代码的用途和功能,并且在团队协作中非常有用。
 
xxx语没有行内注释与多行注释之分,其写法如下:
 
我觉得 睡前来一杯牛奶很助眠。
 
或者
 
我想 睡前来一杯牛奶。
 
其中,<code>睡前来一杯牛奶很助眠</code>和<code>睡前来一杯牛奶</code>被称为注释的文本。<code>我觉得</code>和<code>我想</code>是用于标记注释开始的关键字,句号是用于标记注释结束的关键字。'''注释需要使用关键字'''是该语言的特色之一。
 
==语气词==
 
语气词是xxx语中一些无意义的关键字,它也是一种注释,但不包含自定义文本的部分。这些关键字在现在没有意义,在未来也不会赋予任何意义。
 
{| class="wikitable"
| entry a || entry b || entry c
|-
| entry a || entry b || entry c
|}
 
=基本表达式=
 
表达式用于向机器描述您的意图。表达式由操作数和运算符组成。把表达式写在代码中合适的位置就会被执行,它会按照运算符的优先级依次计算。在每次运算中,运算符会对它所需要使用的操作数进行运算。每次运算都会消耗运算符和操作数,这意味着运算的结果将代替原本的运算符与操作数成为一个新的操作数。
 
先看一个例子:
 
整数 杯子 的值为 5 加上 7
 
这条代码将<code>5 加上 7</code>的结果赋予到整数<code>杯子</code>中。
 
xxx语言具有丰富的运算符,'''同一个运算符还可能有多种不同的写法'''以适应不同的语气。使用纯符号运算符不需要空格,使用关键字运算符有空格,否则可能会被当作其他的普通标识符。
 
以下这些是最常使用的几个运算符。
 
==算数运算符==
 
算数运算符是使用浮点或整型作为操作数运算的运算符,运算结果的类型与操作数相同,即没有自动类型转换。
 
{| class="wikitable"
|-
! 运算符 !! 描述 !! 例子
|-
| <code>+</code> <code>加</code> <code>加上</code> || 加法 - 将两操作数相加 || <code>7+3</code>的输出结果为整数"10"
|-
| <code>-</code> <code>减</code> <code>减去</code> || 减法 - 将左边的操作数减去右边的操作数 || <code>7-3</code>的输出结果为整数"4"
|-
| <code>*</code> <code>乘</code> <code>乘以</code> || 乘法 - 将两操作数相乘 || <code>7*3</code>的输出结果为整数"21"
|-
| <code>/</code> <code>除以</code> || 除法 - 将左边的操作数除以右边的操作数,取小数<br/>操作数只能是浮点类型 || <code>7.0/3.0</code>的输出结果为浮点数<br/>"2.3333333333333333333333333333333"
|-
| <code>整除</code> || 整除 - 将左边的操作数除以右边的操作数,取商 || <code>7 整除 3</code>的输出结果为整数"2"
|-
| <code>模</code> || 取余 - 将左边的操作数除以右边的操作数,取余数 || <code>7 模 3</code>的输出结果为整数"1"
|}
 
==比较运算符==
 
比较运算符是使用浮点或整型作为操作数的运算符,运算结果的类型是布尔类型。
 
{| class="wikitable"
|-
! 运算符 !! 描述 !! 例子
|-
| <code>==</code> <code>等于</code> || 检查两个操作数的值是否相等,如果相等则为真 || <code>5+3</code>的输出结果为布尔值"8"
|-
| <code>!=</code> <code>不等于</code> || 检查两个操作数的值是否相等,如果不相等则为真 || <code>5-3</code>的输出结果为布尔值"2"
|-
| <code>></code> <code>大于</code> || 检查左操作数的值是否大于右操作数的值,如果是则为真 || <code>5*3</code>的输出结果为布尔值"15"
|-
| <code><</code> <code>小于</code> || 检查左操作数的值是否小于右操作数的值,如果是则为真 || <code>我是代码</code>的输出结果为布尔值""
|-
| <code>>=</code> <code>不小于</code><br/><code>大于等于</code> || 检查左操作数的值是否大于或等于右操作数的值,如果是则为真 || <code>我是代码</code>的输出结果为布尔值""
|-
| <code><=</code> <code>不大于</code><br/><code>小于等于</code> || 检查左操作数的值是否小于或等于右操作数的值,如果是则为真 || <code>我是代码</code>的输出结果为布尔值""
|}
 
==逻辑运算符==
 
逻辑运算符是使用布尔值作为操作数的运算符,运算结果的类型是布尔类型。
 
{| class="wikitable"
|-
! 运算符 !! 描述 !! 例子
|-
| <code>并且</code> || 如果两个操作数都为真,则为真 || <code>我是代码</code>的输出结果为布尔值""
|-
| <code>或者</code> || 如果两个操作数至少有一个为真,则为真 || <code>我是代码</code>的输出结果为布尔值""
|-
| <code>不成立</code> || 如果操作数为真,则表达式为假;如果操作数为假,则表达式为真 || <code>我是代码</code>的输出结果为布尔值""
 
|}
 
=代码块=
 
代码块是xxx语的核心概念,也是该语言的特色之一。
 
代码块的写法如下:
 
    ...
这些事
 
上述代码中,"..."代表您可以在此处插入代码,例如:
 
    我是代码
    我是代码
    我是代码
这些事
 
可插入的代码数量不限。
 
注意看:
 
A
    B
    ...
这些事
 
其中,B所在的位置,是这个代码块的'''内部''';A所在的位置,是这个代码块的'''外层'''。
 
代码块可以写在程序中,也可以写在任何可以插入代码的位置。代码块可以被写在代码块的内部,这被称为代码块的嵌套,例如:
 
    做
        ...
    这些事
    ...
这些事
 
同样的,嵌套的层数不限。
 
==作用域==
 
在标识符经历了声明后,在一定范围内相同的标识符可以指代相同的东西,这个范围被称作'''作用域'''。
 
在xxx语中,任何一个标识符一旦在程序中完成声明,它的作用域就是自声明位置开始,直至程序代码结束的全部文本剩余部分。
 
在下面这个代码块的内部,标识符""被赋予了""这个值。在""这行代码前,标识符""的含义未被定义,您不能在标识符被声明前使用它。
 
    //""未定义
    我是代码
    //我所在的位置可以正常使用""
这些事
//我在上面这个代码块的外部,""未定义
 
最后一行注释由于在代码块的外层,不在标识符""的作用域内。
 
'''与其他语言不同的是,xxx语的代码块内部不能直接使用外层已声明的标识符。'''这意味着,声明的作用域不包含代码块。如下所示的这几行代码中,代码块的内部无法使用""。
 
我是代码
//我这里可以使用""
    //而我这里""未定义
这些事
//我不在代码块里,不过我也能使用""
 
另一个例子:
 
    我是代码
    //我这里可以使用""
    做
        //而我这里""未定义
    这些事
    //我与声明在同一个代码块里,所以我能使用""
这些事
 
上述这样的限制存在,为的是当您在编写代码时,您无需担心您的标识符已经被远在另一头的代码占用。大胆使用相同的关键字!本语言鼓励您使用相同的关键字写出易于理解的代码,专注于对您来说更重要的事。
 
此外,当您编辑一个xxx语源代码文件时,可以假想为您正在编辑一个代码块的内部,而这一整个文件就是那个代码块。
 
=引入=
 
引入是使代码块与外界交互的重要代码。如果没有引入,由于代码块内部与外层隔离,代码块将无法发挥作用。
 
观察下面这段代码,注意""与""的值为何不同:
 
我是代码
我是代码
    我是代码
    我是代码
    //""被引入了,不能再次赋值,并且可以直接使用
    我是代码
这些事
 
此时,外层标识符所指的数据与内部标识符所指的数据是同一个。
 
我是代码
 
这条指令就是引入,它代表把""引入到当前的代码块内。引入可以写在任意可以插入代码的位置,但是只有引入后的被引入的关键字才能使用。请尽量写在易于发现的地方,比如最开头或最结尾。
 
引入不仅能引入已赋值的标识符,还能引入已声明但未赋值的值:
 
我是代码
我是代码
    我是代码
    我是代码
    我是代码
这些事
//如果此时使用""是不行的,因为它没有被赋值
我是代码
 
这样,代码块的内部就可以和外层交互。'''这意味着引入可能导致的数据流向是双向的。'''它可以从外层把数据传入内部,也可以把数据从内部传给外层,同时外层不会被内部的标识符影响。尽管数据可以同时流入和流出,不过本语言仍然建议您为单一关键字计划明确的单方向数据流向,不要吝啬关键字的数量。
 
您也可以在引入时声明,这相当于在外层声明然后立即引入。赋值后,关键字在外层仍然可用。
 
    我是代码
    我是代码
这些事
我是代码
 
如果被引入的关键字之前就已经被占用了,您不能直接从外部引入它,这将导致编译器无法区分这两个不同的数据。您可以别名的方式引入。当以别名方式引入外层的一个关键字时,在这个代码块内,所有以别名作为关键字的使用或赋值最终都会影响到外层的那个关键字。如果没有额外的声明,代码块内部仍然无法使用外层关键字。并且即使声明了与外层相同的关键字,这两个关键字所指的数据也不会是同一个。
 
我是代码
我是代码
    我是代码
    //关键字""已经被声明占用
    我是代码
    我是代码
    我是代码
    //下面这是引入并别名
    我是代码
    我是代码
这些事
//在外层它仍然以原名获得数值
我是代码
 
以别名方式引入的关键字同样可以在引入时声明,以下是它的写法:
 
我是代码
 
=分支=
 
分支是您迈向流程控制的第一步!
 
分支是一种流程控制,让您可以选择是否运行某条代码,或是选择运行多条代码之一。
 
一个分支由至少一个布尔类型的和与其对应数量对应的代码块组成。
 
选择分支结构:
 
如果 我是代码 就
    ...
这些事
不然就做
    ...
这些事
 
如果<code>我是代码</code>的值为布尔值"真",就执行第一个代码块的内容,也就是A点部分的代码
 
=变量=
 
 
> 本章内容未进行严格的论证,未确定具体的副作用
 
=循环=
 
> 本章内容未进行严格的论证,未确定具体的副作用
 
=函数=
 
==普通函数==
 
> 普通函数的创建方法要卸载这儿
 
===调用普通函数===
 
===使用标准库中的函数===
 
==偏函数==
 
> 本章内容未进行严格的论证,未确定具体的副作用
 
> 此处应该写如何把普通函数包装成偏函数对象
 
> 偏函数有一些实验性语法还未进行严格的论证,比如将偏函数作为一等公民的想法还在策划
 
===调用偏函数===
 
==返回值函数==
 
> 本章内容未进行严格的论证,未确定具体的副作用
 
> 此处应该写如何将普通函数或偏函数包装成返回值函数,以及形成返回值函数的各种限制
 
> 此处会提到表达式中可以使用返回值函数
 
 
 
=面向对象=
 
> 本章内容未进行严格的论证,未确定具体的副作用
 
概念:
 
* 对象
* 类
* 结构
* 方法
 
继承
改写
 
==封包与肢解==
 
封包是指将一组
 
肢解是一种特殊的导入,将对象中的某个函数及它的依赖加载到当前作用域中
 
=复杂表达式=
 
==位运算符==
 
位运算符是逻辑运算符的扩展。
 
=错误处理=
 
=约定=
 
该语言本身不具备某种数据结构,这是鼓励程序员自己实现。
 
不过,这里提出了一些约定配合标准库实现了一些其他语言常见的数据结构。
 
==带参数的排序==
 
==字典==
 
==递归==
 
=里面有什么?=
 
> todo
 
本章介绍编译器在编译时内部会发生什么。
 
==内存布局==
 
编译后的可执行文件在内存中的布局只包含'''代码区'''和'''栈区''',这是该语言的特色之一。
 
> 为并发添加分段栈的内容仍然在讨论阶段。以下内容仅供参考。
 
当您在源代码文件中添加了至少一行并发多线程代码时(即使用进程冷却锁),会引入一个额外的标准库。这会导致栈区变更为分段栈,这意味着它本质上是一个堆,由标准库自动进行内存管理。多线程会导致额外且不明显的内存与性能开销。
 
==影子栈==
 
xxx语言刻意向程序员隐藏了生命周期的概念。
 
这为内存安全的特性保驾护航。

2026年6月3日 (三) 19:07的最新版本

表白

我爱你LNN。千言万语汇集成简单表述,但我知道这是不够的。我不知道我能给你什么,但你填满了我(各种意义上)。你击碎了我为掩耳盗铃而筑起的高墙,温暖了我的心灵,让我感受到前所未有的关心与爱。我真希望能与你白头偕老。

任务

这是任务,要在此处的编辑工作:

  • 设计基本的语法
  • 完成分支模块的书写

本文尚未完工!

该语言当前处于构想阶段,有较多内容还未完全确立。目前主要以概念形式表达,具体的语法正在设计。

目前本文的书写方法有很多留空,这并不代表未来不会有具体的内容。

本文格式

> 代表注释。在本文最终完工时,所有注释都会被移除。

当注释被使用时,代表本段内容很可能在未来作出更改。

简介

xxx语是一门高级编程语言,声明式语言

> 是的,我们连名字都未想好

特点

代码预览

我是代码
我是代码

图灵完备证明

该代码可以模拟一个[[]],证明了本语言是图灵完备的。

> 这个章节不可能叫图灵完备证明,届时会更名为图灵机的名字。

我是代码

运行xxx语程序

要运行使用xxx语编写的程序,预期的用途是将源代码作为编译器的输入,从而被编译成可执行的目标语言的代码。

Python编译器

将Python视为机器码的编译器。

[[解释器资源地址|Python实现]]

> 等待开发计划

WhatLang编译器

将WhatLang视为机器码的编译器。

[[解释器资源地址|Python实现]]

> 等待开发计划

使用xxx语表达编译器程序不是该语言的强项,实现有一定难度。在一段时间内,语言的设计者认为没有必要开发。

基本要素

让我们看一段xxx语代码

xxx语的代码可使用的字符包含了:所有ASCII可见字符(包含空格)及《通用汉字规范表》中的所有汉字。

未指定字符所使用的编码。目前几个有效的编译器都能接受以UTF-8为的编码的纯文本文件作为源代码文件。理论上允许使用上述字符集以外的字符作为代码的一部分,但未处理任何特殊情况,可能发生未知的错误。

xxx语的代码完全由以下这些要素构成:

  • 关键字
  • 标识符
  • 字面量

xxx语的关键字包含了在其他语言中通常被称为运算符与结构符的词元。

xxx语的代码是大小写敏感的,这意味着appleApple不是同一个词元。

xxx语对缩进不敏感。

> 目前还未设计如何区分关键字与标识符。可能会像文言一样标识符有统一的特殊的格式,也可能像Python一样非关键字就是标识符。

xxx语标识符

标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。

xxx语的标识符的特点在于:

  • 第一点
  • 第二点
  • 第三点
  • ...

> 额,我没设计好

xxx语关键字

> 这一段好像有点问题,因为这个语言可能没有关键字这样的概念

下面列出了xxx语中的关键字。关键字承担着赋予代码明确语义的重要能力,是语言中的核心词元。您不能将其作为常量、变量、类或任何标识符的名称。

这些词元的具体作用会在下文逐步揭示。

entry a entry b entry c
entry a entry b entry c

下面列出了xxx语中的保留字。保留字是指在语言的发展中为未来可能会添加的新特性或语法结构而预先留出的词元。它们目前没有实际的语义功能,但为了保证代码在未来版本中的兼容性,您同样不能将保留字作为常量、变量、类或任何标识符的名称。

entry a entry b entry c
entry a entry b entry c

xxx语字面量

> todo

转义符

数据类型

xxx语中有多种数据类型

xxx语是强类型的,它不支持自动类型转换。如果要转换类型,必须通过调用标准库函数等方法显式地将数据进行类型转换。

原子类型

一、整型

xxx语实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。 int bool char enum

二、浮点

float

结构类型

三、数组

arrary

四、类

对象是类的实例

> todo

声明与赋值

声明是告诉编译器,应该以何种方式读取或写入数据,并为存储数据做准备,这个动作被称为分配内存地址。赋值,是将具体的内容填充到声明时已经分配好的内存地址。在声明时,还需要设置标识符,这是称呼这份数据的名字;在赋值后,就可以通过直接使用标识符,指代其对应的数据。

声明与赋值缺一不可,一个标识符只有在同时经历了声明和赋值之后,才能在代码中被正常使用。

整数 杯子 的值为 3

在这行代码中,整数指明了数据类型,杯子是具体的标识符,而3则是赋予该标识符的数据。

在声明时,如果不添加额外的关键字,那么在同一代码段内,您不能在下文再次声明或赋值同一个标识符,这样的数据也被称为常量。这意味着,xxx语默认声明的是常量。代码段的相关概念在后文介绍。

您可以先声明,然后再赋值。例如:

整数 杯子
杯子 的值为 3

上述的两种声明的写法都被称为显式声明。

xxx语支持自动类型推断。这意味着,您可以在不显式指明数据类型的情况下,直接给一个标识符赋值。编译器会根据赋给它的具体内容,自动推断出该标识符的数据类型并完成内存分配。这种写法也被称为隐式声明。

例如:

杯垫 的值为 5

在这行代码中,虽然我们没有写出代表整数类型的整数,但因为赋予的具体数据5是一个整数,编译器就会自动将杯垫推断为整数类型。在实际效果上,它与 整数 杯垫 的值为 5 是等价的。这种写法只是省去了指明数据类型,但不代表没有声明。这仍然是一行同时声明并赋值的代码。

注释

在计算机语言中,注释是计算机语言的一个重要组成部分,用于在源代码中解释代码的作用,可以增强程序的可读性、可维护性。

xxx语注释是一种在xxx语程序中用于提供代码功能说明的文本。

注释不会被编译器包含在最终的可执行文件中,因此不会对程序的运行结果产生任何影响。

在程序中经常注释是良好的编程习惯,它们帮助程序员更容易地理解代码的用途和功能,并且在团队协作中非常有用。

xxx语没有行内注释与多行注释之分,其写法如下:

我觉得 睡前来一杯牛奶很助眠。

或者

我想 睡前来一杯牛奶。

其中,睡前来一杯牛奶很助眠睡前来一杯牛奶被称为注释的文本。我觉得我想是用于标记注释开始的关键字,句号是用于标记注释结束的关键字。注释需要使用关键字是该语言的特色之一。

语气词

语气词是xxx语中一些无意义的关键字,它也是一种注释,但不包含自定义文本的部分。这些关键字在现在没有意义,在未来也不会赋予任何意义。

entry a entry b entry c
entry a entry b entry c

基本表达式

表达式用于向机器描述您的意图。表达式由操作数和运算符组成。把表达式写在代码中合适的位置就会被执行,它会按照运算符的优先级依次计算。在每次运算中,运算符会对它所需要使用的操作数进行运算。每次运算都会消耗运算符和操作数,这意味着运算的结果将代替原本的运算符与操作数成为一个新的操作数。

先看一个例子:

整数 杯子 的值为 5 加上 7

这条代码将5 加上 7的结果赋予到整数杯子中。

xxx语言具有丰富的运算符,同一个运算符还可能有多种不同的写法以适应不同的语气。使用纯符号运算符不需要空格,使用关键字运算符有空格,否则可能会被当作其他的普通标识符。

以下这些是最常使用的几个运算符。

算数运算符

算数运算符是使用浮点或整型作为操作数运算的运算符,运算结果的类型与操作数相同,即没有自动类型转换。

运算符 描述 例子
+  加上 加法 - 将两操作数相加 7+3的输出结果为整数"10"
-  减去 减法 - 将左边的操作数减去右边的操作数 7-3的输出结果为整数"4"
*  乘以 乘法 - 将两操作数相乘 7*3的输出结果为整数"21"
/ 除以 除法 - 将左边的操作数除以右边的操作数,取小数
操作数只能是浮点类型
7.0/3.0的输出结果为浮点数
"2.3333333333333333333333333333333"
整除 整除 - 将左边的操作数除以右边的操作数,取商 7 整除 3的输出结果为整数"2"
取余 - 将左边的操作数除以右边的操作数,取余数 7 模 3的输出结果为整数"1"

比较运算符

比较运算符是使用浮点或整型作为操作数的运算符,运算结果的类型是布尔类型。

运算符 描述 例子
== 等于 检查两个操作数的值是否相等,如果相等则为真 5+3的输出结果为布尔值"8"
!= 不等于 检查两个操作数的值是否相等,如果不相等则为真 5-3的输出结果为布尔值"2"
> 大于 检查左操作数的值是否大于右操作数的值,如果是则为真 5*3的输出结果为布尔值"15"
< 小于 检查左操作数的值是否小于右操作数的值,如果是则为真 我是代码的输出结果为布尔值""
>= 不小于
大于等于
检查左操作数的值是否大于或等于右操作数的值,如果是则为真 我是代码的输出结果为布尔值""
<= 不大于
小于等于
检查左操作数的值是否小于或等于右操作数的值,如果是则为真 我是代码的输出结果为布尔值""

逻辑运算符

逻辑运算符是使用布尔值作为操作数的运算符,运算结果的类型是布尔类型。

运算符 描述 例子
并且 如果两个操作数都为真,则为真 我是代码的输出结果为布尔值""
或者 如果两个操作数至少有一个为真,则为真 我是代码的输出结果为布尔值""
不成立 如果操作数为真,则表达式为假;如果操作数为假,则表达式为真 我是代码的输出结果为布尔值""

代码块

代码块是xxx语的核心概念,也是该语言的特色之一。

代码块的写法如下:

做
    ...

这些事

上述代码中,"..."代表您可以在此处插入代码,例如:

做
    我是代码
    我是代码
    我是代码
这些事

可插入的代码数量不限。

注意看:

A
做
    B
    ...

这些事

其中,B所在的位置,是这个代码块的内部;A所在的位置,是这个代码块的外层

代码块可以写在程序中,也可以写在任何可以插入代码的位置。代码块可以被写在代码块的内部,这被称为代码块的嵌套,例如:

做
    做
        ...

    这些事
    ...

这些事

同样的,嵌套的层数不限。

作用域

在标识符经历了声明后,在一定范围内相同的标识符可以指代相同的东西,这个范围被称作作用域

在xxx语中,任何一个标识符一旦在程序中完成声明,它的作用域就是自声明位置开始,直至程序代码结束的全部文本剩余部分。

在下面这个代码块的内部,标识符""被赋予了""这个值。在""这行代码前,标识符""的含义未被定义,您不能在标识符被声明前使用它。

做
    //""未定义
    我是代码
    //我所在的位置可以正常使用""
这些事
//我在上面这个代码块的外部,""未定义

最后一行注释由于在代码块的外层,不在标识符""的作用域内。

与其他语言不同的是,xxx语的代码块内部不能直接使用外层已声明的标识符。这意味着,声明的作用域不包含代码块。如下所示的这几行代码中,代码块的内部无法使用""。

我是代码
//我这里可以使用""
做
    //而我这里""未定义
这些事
//我不在代码块里,不过我也能使用""

另一个例子:

做
    我是代码
    //我这里可以使用""
    做
        //而我这里""未定义
    这些事
    //我与声明在同一个代码块里,所以我能使用""
这些事

上述这样的限制存在,为的是当您在编写代码时,您无需担心您的标识符已经被远在另一头的代码占用。大胆使用相同的关键字!本语言鼓励您使用相同的关键字写出易于理解的代码,专注于对您来说更重要的事。

此外,当您编辑一个xxx语源代码文件时,可以假想为您正在编辑一个代码块的内部,而这一整个文件就是那个代码块。

引入

引入是使代码块与外界交互的重要代码。如果没有引入,由于代码块内部与外层隔离,代码块将无法发挥作用。

观察下面这段代码,注意""与""的值为何不同:

我是代码
我是代码
做
    我是代码

    我是代码
    //""被引入了,不能再次赋值,并且可以直接使用
    我是代码
这些事

此时,外层标识符所指的数据与内部标识符所指的数据是同一个。

我是代码

这条指令就是引入,它代表把""引入到当前的代码块内。引入可以写在任意可以插入代码的位置,但是只有引入后的被引入的关键字才能使用。请尽量写在易于发现的地方,比如最开头或最结尾。

引入不仅能引入已赋值的标识符,还能引入已声明但未赋值的值:

我是代码
我是代码
做
    我是代码

    我是代码
    我是代码
这些事
//如果此时使用""是不行的,因为它没有被赋值
我是代码

这样,代码块的内部就可以和外层交互。这意味着引入可能导致的数据流向是双向的。它可以从外层把数据传入内部,也可以把数据从内部传给外层,同时外层不会被内部的标识符影响。尽管数据可以同时流入和流出,不过本语言仍然建议您为单一关键字计划明确的单方向数据流向,不要吝啬关键字的数量。

您也可以在引入时声明,这相当于在外层声明然后立即引入。赋值后,关键字在外层仍然可用。

做
    我是代码

    我是代码
这些事
我是代码

如果被引入的关键字之前就已经被占用了,您不能直接从外部引入它,这将导致编译器无法区分这两个不同的数据。您可以别名的方式引入。当以别名方式引入外层的一个关键字时,在这个代码块内,所有以别名作为关键字的使用或赋值最终都会影响到外层的那个关键字。如果没有额外的声明,代码块内部仍然无法使用外层关键字。并且即使声明了与外层相同的关键字,这两个关键字所指的数据也不会是同一个。

我是代码
我是代码
做
    我是代码
    //关键字""已经被声明占用
    我是代码

    我是代码
    我是代码

    //下面这是引入并别名
    我是代码
    我是代码
这些事
//在外层它仍然以原名获得数值
我是代码

以别名方式引入的关键字同样可以在引入时声明,以下是它的写法:

我是代码

分支

分支是您迈向流程控制的第一步!

分支是一种流程控制,让您可以选择是否运行某条代码,或是选择运行多条代码之一。

一个分支由至少一个布尔类型的和与其对应数量对应的代码块组成。

选择分支结构:

如果 我是代码 就
做
    ...

这些事
不然就做
    ...

这些事

如果我是代码的值为布尔值"真",就执行第一个代码块的内容,也就是A点部分的代码

变量

> 本章内容未进行严格的论证,未确定具体的副作用

循环

> 本章内容未进行严格的论证,未确定具体的副作用

函数

普通函数

> 普通函数的创建方法要卸载这儿

调用普通函数

使用标准库中的函数

偏函数

> 本章内容未进行严格的论证,未确定具体的副作用

> 此处应该写如何把普通函数包装成偏函数对象

> 偏函数有一些实验性语法还未进行严格的论证,比如将偏函数作为一等公民的想法还在策划

调用偏函数

返回值函数

> 本章内容未进行严格的论证,未确定具体的副作用

> 此处应该写如何将普通函数或偏函数包装成返回值函数,以及形成返回值函数的各种限制

> 此处会提到表达式中可以使用返回值函数


面向对象

> 本章内容未进行严格的论证,未确定具体的副作用

概念:

  • 对象
  • 结构
  • 方法

继承 改写

封包与肢解

封包是指将一组

肢解是一种特殊的导入,将对象中的某个函数及它的依赖加载到当前作用域中

复杂表达式

位运算符

位运算符是逻辑运算符的扩展。

错误处理

约定

该语言本身不具备某种数据结构,这是鼓励程序员自己实现。

不过,这里提出了一些约定配合标准库实现了一些其他语言常见的数据结构。

带参数的排序

字典

递归

里面有什么?

> todo

本章介绍编译器在编译时内部会发生什么。

内存布局

编译后的可执行文件在内存中的布局只包含代码区栈区,这是该语言的特色之一。

> 为并发添加分段栈的内容仍然在讨论阶段。以下内容仅供参考。

当您在源代码文件中添加了至少一行并发多线程代码时(即使用进程冷却锁),会引入一个额外的标准库。这会导致栈区变更为分段栈,这意味着它本质上是一个堆,由标准库自动进行内存管理。多线程会导致额外且不明显的内存与性能开销。

影子栈

xxx语言刻意向程序员隐藏了生命周期的概念。

这为内存安全的特性保驾护航。