【倉頡】入門文件程式碼圓周率估算程式碼更正

Do1phln發表於2024-08-04
專案 實現前 實現後
程式碼組織方式 模組/包 二級結構 包/子包 樹形結構
沒有父包的包稱為 root 包,root 包及其子包(包括子包的子包)構成的整棵樹稱為 module
編譯單元 包(每個子包單獨編譯)
訪問修飾符 public:
可修飾頂層和非頂層成員,包內外可見
default(不寫):僅本包內可見
protected:只能修飾 class 的成員,本包內可見、本 class 及其子類可見
private:不能修飾 top-level 成員、僅當前作用域可見
以下所有訪問修飾符均可修飾頂層和非頂層成員
public:本 module 內外可見
protected:本 module 和子型別內可見
internal:本包及其子樹可見
private:修飾頂層宣告時僅本檔案內可見,修飾非頂層宣告時僅當前型別或擴充套件定義內可見
package 訪問修飾符 package a.b(= public package a.b)
protected package a.b
internal package a.b
import 訪問修飾符 public import
import
public import
protected import
internal import
import(= private import)
從 module 匯入的語法 from std import time.* 不再有 from 語法,只有 import std.time.* 的語法
多匯入的語法 from std import time.*, math.*
import a.*, b.*
import std.{time.*, math.*}
import
匯入的語義 from std import time.Duration
可以同時看到 time 和 Duration 這兩個符號
import std.time.Duration
只看能看到 Duration 這一個符號
單匯入 可以匯入頂層宣告,不可以匯入包名
from std import time // error
from std import time.Duration // OK
可以匯入頂層宣告、也可以匯入包名
import std.time // ok
import std.time.Duration // OK
別名匯入 from std import time.* as stdTime.* // OK
from std import time.Duration as stdDuration // OK
import std.time.* as stdTime.* // error
import std.time.Duration as stdDuration // OK
別名匯入的作用域 和當前包頂層宣告處於同一作用域
from std import time.Duration as stdDuration
let stdDuration = 1 // error: redefinition
和當前包頂層宣告處於不同作用域,且優先順序更低,若 shadow 則告警
import std.time.Duration as stdDuration // warning: shadow
let stdDuration = 1 // OK
重複匯入並取別名 使用 import as 對匯入的宣告重新命名後,當前包內只能使用別名,無法使用原名
from std import time.Duration // error: time.Duration is renamed
from std import time.Duration as stdDuration
允許使用多條匯入語句分別匯入原名和重新命名
import std.time.Duration
import std.time.Duration as Duration1
import std.time.Duration as Duration2

let _ = Duration.second // OK
let _ = Duration1.second // OK
let _ = Duration2.second // OK
package hello
import std.random.*//from xxx import bbb -> import xxx.bbb
import std.math.*

main(): Int64 {
    const N = 1000000
    var n: UInt32 = 0
    let random = Random()
    for (_ in 0..N) {
        let x = random.nextFloat64()
        let y = random.nextFloat64()
        if ((x - 0.5) ** 2 + (y - 0.5) ** 2 < 0.25) {
            n += 1
        }
    }
    let pi = Float64(n) / Float64(N) * 4.0
    println('pi = ${pi}')
    println('deviation = ${abs(Float64.PI - pi)}')
    println("hello world")
    return 0
}

相關文章