From 3ecd8f44782c3b37943607f26499c385b3110fea Mon Sep 17 00:00:00 2001 From: ridethepig Date: Fri, 17 Mar 2023 17:41:06 +0800 Subject: [PATCH] get familiar with pa1 --- .gitignore | 1 + CS143体验报告.md | 24 +++++++++++++++++++ assignments/PA1/stack.cl | 52 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 CS143体验报告.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5683457 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.s diff --git a/CS143体验报告.md b/CS143体验报告.md new file mode 100644 index 0000000..e6d0e0d --- /dev/null +++ b/CS143体验报告.md @@ -0,0 +1,24 @@ +# CS143 体验报告 + +## 理论课程部分 + +> 待施工 + +## Written Assignment 部分 + +> 既然它网站上都放了,那我就姑且做一下? +> +> 还没咋做捏 + +## Programming Assignment 部分 + +### 开始之前 + +这门课的官方材料好像每隔几年就会换一个地方,导致找起来十分的困难(之前做的 xv6 就很棒,多少年的东西都放在同一个网站上),现在这个时间点(2023年3月)的官网应该是在 edx 上面,需要注册收费之类的才能获取相关材料。不过这门课历史悠久,基本上从2000年左右就有了,自然是被大家复制传播到了各种地方。这个 repo 里面的 starter code 是从 github 上别人的仓库里面的分发包(`student-dist.tar.gz`)解压出来的,我对比了几个仓库的代码内容都是一样的,那么做这个版本的应该问题不大。不过和课程网站上的内容还是有一些不同的,这就没有办法了,大家也拿不到 Stanford 的内部版本。 + +### PA1 + +第一个实验是用 COOL 写一个简单的程序,程序的功能是解释一个简单的 Stack Machine 语言,会输入一些序列然后按照文档的说明进行操作。 + +推荐的实现方式是,定义一个 `StackCommand` 类,然后为每一条命令实现一个子类用来执行具体的操作。这里还给了一个工具类 `atoi.cl`,里面实现了 `String` 到 `int` 的转换。不需要实现错误处理,假设给出的序列都是合法的。 + diff --git a/assignments/PA1/stack.cl b/assignments/PA1/stack.cl index 578cf60..90d188a 100644 --- a/assignments/PA1/stack.cl +++ b/assignments/PA1/stack.cl @@ -7,10 +7,56 @@ * Skeleton file *) -class Main inherits IO { +class List { + isNil() : Bool { true }; + head() : String { { abort(); ""; } }; + tail() : List { { abort(); self; } }; + cons(i : String) : List { + (new Cons).init(i, self) + }; +}; - main() : Object { - out_string("Nothing implemented\n") +class Cons inherits List { + car : String; -- The element in this list cell + cdr : List; -- The rest of the list + isNil() : Bool { false }; + head() : String { car }; + tail() : List { cdr }; + init(i : String, rest : List) : List { + { + car <- i; + cdr <- rest; + self; + } + }; +}; + +class Main inherits IO { + stack : List; + print_list(l: List) : Object { + if l.isNil() then { + out_string("\n"); + } + else { + out_string(l.head()); + out_string(" "); + print_list(l.tail()); + } + fi }; + main() : Object { + { + stack <- new List; + let x: String <- "" in { + while (not(x = "x")) loop { + x <- in_string(); + stack <- stack.cons(x); + } + pool; + }; + stack <- stack.tail(); + print_list(stack); + } + }; };