From a1b20b3072ce60d8e83ff135751dc572e8ce6a7e Mon Sep 17 00:00:00 2001 From: YbrStudio <79822594+Ybr2007@users.noreply.github.com> Date: Sat, 28 Sep 2024 12:22:59 +0800 Subject: [PATCH] Deployed fa85c97 with MkDocs version: 1.5.3 --- 404.html | 180 +-- blog/cpp/ret_based_overload/index.html | 180 +-- blog/cyan/general/index.html | 970 ------------ blog/cyan/variables/index.html | 1390 ----------------- .../learning_notes/string_encoding/index.html | 188 +-- .../article/index.html | 186 +-- blog/python/what_is_same/article/index.html | 941 ----------- essay/2023to2024/index.html | 180 +-- index.html | 180 +-- search/search_index.json | 2 +- sitemap.xml | 25 +- sitemap.xml.gz | Bin 327 -> 300 bytes 12 files changed, 43 insertions(+), 4379 deletions(-) delete mode 100755 blog/cyan/general/index.html delete mode 100755 blog/cyan/variables/index.html delete mode 100755 blog/python/what_is_same/article/index.html diff --git a/404.html b/404.html index faad2c4..537e657 100755 --- a/404.html +++ b/404.html @@ -548,7 +548,7 @@ - Cyan语言 + 学习笔记 @@ -557,93 +557,6 @@ - - - - - - - - - - - - - - - - - -
  • - - - - - - - - - - @@ -914,6 +740,10 @@

    404 - Not found

    + + + + \ No newline at end of file diff --git a/blog/cpp/ret_based_overload/index.html b/blog/cpp/ret_based_overload/index.html index 9fdbda0..7ade30d 100755 --- a/blog/cpp/ret_based_overload/index.html +++ b/blog/cpp/ret_based_overload/index.html @@ -625,7 +625,7 @@ - Cyan语言 + 学习笔记 @@ -634,93 +634,6 @@ - -
  • - - - - - - - - - - - - - - - -
  • - - - - - - - - - - @@ -1147,6 +973,10 @@

    基于返回值的函数重载

    + + + + \ No newline at end of file diff --git a/blog/cyan/general/index.html b/blog/cyan/general/index.html deleted file mode 100755 index 1092634..0000000 --- a/blog/cyan/general/index.html +++ /dev/null @@ -1,970 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - 什么是Cyan语言? - Ybr Studio Website - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - Skip to content - - -
    -
    - -
    - - - - - - -
    - - - - - - - -
    - -
    - - - - -
    -
    - - - -
    -
    -
    - - - - - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    - - - - - - - -

    什么是Cyan语言?

    -

    Cyan编程语言是一门我正在设计并实现的一种新的编程语言。我尝试借此加深对编译原理、编程语言原理和编程语言底层的理解,同时试图吸收不同语言的优秀特性,尽可能创造出一门灵活但又尽可能严谨的编程语言。

    -

    如果Cyan语言成功实现,该模块下的内容将作为Cyan语言文档。

    - - - - - - - - - - - - - -
    -
    - - - -
    - - - -
    - - - -
    -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/blog/cyan/variables/index.html b/blog/cyan/variables/index.html deleted file mode 100755 index 55e09e7..0000000 --- a/blog/cyan/variables/index.html +++ /dev/null @@ -1,1390 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - 变量 - Ybr Studio Website - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - Skip to content - - -
    -
    - -
    - - - - - - -
    - - - - - - - -
    - -
    - - - - -
    -
    - - - -
    -
    -
    - - - - - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    - - - - - - - -

    类型系统

    -

    类型系统是一门编程语言的基础,本文将介绍Cyan中的类型系统。

    -

    静态类型变量

    -

    静态类型变量(Static Type Variables)是必须在编译期确定其类型,并且只能保存该类型或该类型的子类型的对象的变量。

    -

    定义

    -

    使用let关键字来定义静态类型变量。 -

    let a: int = 42;
    -
    -可以看到,变量定义由以下几部分构成:

    -
      -
    • 变量定义关键字(此处为let
    • -
    • 变量名称
    • -
    • 类型标注(Type Annotation)
    • -
    • 初始化表达式
    • -
    -

    一条变量定义语句可以包含多个变量,用,分隔。例如: -

    let a: int = 42, b: int = 43;
    -

    -

    可变与不可变性

    -

    默认情况下,静态类型变量是不可变的(Immutable),也就是说,一旦定义了变量,就不能再对其赋值。 -

    let a: int = 42;
    -a = 43;  // 编译错误
    -

    -

    如果想要将变量定义为可变的(Mutable),可以在变量定义语句中添加mut关键字。 -

    let mut a: int = 42;
    -a = 43;  // OK
    -
    -注意,语义上mut a是一个整体,也就是说一条变量定义语句可以同时定义可变变量和不可变变量。

    -

    赋值

    -

    静态类型变量只能保存一个特定类型或其子类型的对象,尝试将其他类型的对象赋值会报错。 -

    let mut a: int = 42;
    -a = "43";  // 编译错误
    -

    -

    如果要将一个有多个可能的类型的对象赋值给静态类型变量,直接赋值会导致编译错误,可使用'(类型保证符)来向编译器说明开发者保证该对象在运行时的类型一定符合变量的类型。 -

    fn foo() -> int | str {
    -    if input() == "A" {
    -        return 42;
    -    } else {
    -        return "42";
    -    }
    -}
    -
    -let mut a: int;
    -a = foo();  // 编译错误
    -a = foo()';  // 由开发者保证此处`foo()`返回的类型一定为`int`,通过编译
    -

    -

    注意,如果将一个类型不可能是某静态类型变量对应的类型或其子类型的对象赋值给该变量,无论是否添加',都会报错。 -

    fn foo() -> int | str {
    -    if input() == "A" {
    -        return 42;
    -    } else {
    -        return "42";
    -    }
    -}
    -
    -let a: bool = foo();  // 编译错误
    -let b: bool = foo()';  // 编译错误
    -

    -

    如果一个变量在使用时从未被赋值过(定义时也未被初始化),则会报错。 -

    let a: int;
    -print(a);  // 运行时错误
    -

    -

    类型推导

    -

    在变量定义语句中,如果变量有初始化表达式,则可以自动进行类型推导,无需显式进行类型标注。 -

    let a = 42;  // 自动推导出类型为int
    -

    -

    类型推导的结果是初始化表达式的类型,如果初始化表达式有多个可能的类型,则会出现编译错误。 -

    fn foo() -> int | str {
    -    if input() == "A" {
    -        return 42;
    -    } else {
    -        return "42";
    -    }
    -}
    -
    -let a = foo();  // 编译错误
    -

    -

    动态类型变量

    -

    动态类型变量(Dynamic Type Variables)是可以先后保存类型互不兼容的对象的变量。

    -

    定义

    -

    使用var关键字来定义动态类型变量。 -

    var a = 42;
    -

    -

    由于动态类型变量自身的特性,无需使用mut关键字来声明可变性(如果使用会报错)。

    -

    动态特性

    -

    动态类型变量提供了灵活的动态类型支持,默认情况下动态类型变量可以保存任何类型的对象。 -

    var a = 42;
    -a = "Hello World";  // OK
    -a = true;  // OK
    -

    -

    如果想要限制动态类型变量的类型,可以在定义变量时使用类型标注。 -

    var a: int | str = 42;
    -a = "Hello World";  // OK
    -a = true;  // 编译错误
    -

    -

    Cyan编译器会追踪动态类型变量在被使用位置的可能类型,并检查与使用要求的类型是否兼容。 -

    var a: int | bool = false;
    -
    -if input() == "A" {
    -    a = 1;
    -    print(a * 2);  // 此处`a`的类型被追踪为`int`,OK
    -}
    -
    -print(a * 2);  // 此处`a`的类型被追踪为`int | bool`,编译错误
    -

    -

    如果保证一个可能有多个类型的变量在某处被使用时一定合法,可使用'(类型保证符)来向编译器说明开发者保证该对象在运行时的类型一定符合变量的类型。 -

    var a: int | bool = false;
    -
    -if input() == "A" {
    -    a = 1;
    -}
    -
    -print(a' * 2);  // OK
    -

    -

    常量

    -

    常量(Constant)是必须在编译期确定其值,且在运行时不能被修改的变量。

    -

    定义

    -

    使用const关键字来定义常量。 -

    const a: int = 42;
    -

    -

    常量定义时必须有初始化表达式,同时可省略类型标注。

    -

    常量不能被赋值,这与不可变的静态类型变量类似。但不同的是,常量的值必须在编译期确定,而静态类型变量的值在运行时确定。 -

    const a = 1;
    -a = 2;  // 编译错误
    -
    -let b = input();  // OK
    -const c = input();  // 编译错误,`input()`的返回值不能在编译期确定
    -
    -const fn foo() -> int {
    -    return 42;
    -}
    -const d = foo();  // OK
    -

    -

    编译期类型与运行时类型

    -

    Cyan中的三种变量均已介绍完毕,接下来有必要辨析编译期类型(Compile-Time Type)运行时类型(Runtime Type)的区别。

    -

    编译期类型是指在编译阶段,用于进行类型检查、类型约束的类型,而运行时类型是指在运行时变量的实际类型。考虑以下代码: -

    let a: object = 42;
    -let b: int = a;
    -let c: float = b;
    -
    -print(typeof(a), typeof(b), typeof(c));  // 输出:int int int
    -

    -

    其中变量a b c的类型标注object int float就属于编译期类型,而变量a b c的运行时实际类型int属于运行时类型。

    -

    一般情况下,编译期类型与运行时类型相同,或者兼容运行时类型而不相同,我们称这种情况为类型正确,反之,则称之为类型异常。类型异常可能在使用了类型保证符,但实际上并没有保证类型的正确性的情况下出现,例如: -

    var a: int | bool = false;
    -if input() == "A" {
    -    a = 1;
    -}
    -let b: int = a';
    -
    -以上代码可以通过编译,但是如果开发者为能保证输入一定是"A",则会导致

    - - - - - - - - - - - - - -
    -
    - - - -
    - - - -
    - - - -
    -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/blog/learning_notes/string_encoding/index.html b/blog/learning_notes/string_encoding/index.html index 8fdcc11..3f8a97d 100755 --- a/blog/learning_notes/string_encoding/index.html +++ b/blog/learning_notes/string_encoding/index.html @@ -13,7 +13,7 @@ - + @@ -546,93 +546,6 @@ - - - - - - - -
  • - - - - - - - - - - - -
  • - - - - - - - - @@ -647,10 +560,10 @@ - + -