MyLang 演算法交換語言

沙棗發表於2016-06-29

Spp 語言有 Scheme 的簡潔,還有 Perl6 的強大能力,不但能使用物件導向的方式程式設計,還能用面向訊息的方式程式設計。而且是一門完全開源的語言。

Spp 語言能夠在多種平臺上快速開發,因為能夠快速轉換成許多語言,以適應不同的需求。

太多的程式語言讓程式設計師焦頭爛額,而一種簡單的,可以轉換成多種語言的開發語言無疑成為語言中的紙幣,可以在更大範圍內流通。

不同的語言可以用 Spp 語言來交換演算法,這樣就讓語言的通用性更強。

Spp 語言是面向程式設計師的語言,而後臺可能是任意語言。程式設計師只需要學會一種語言,就能在多種平臺上開發。

如果需要在特殊的平臺上開發,保持語言一致的前提下,可以增加特殊的擴充套件庫。

註釋, 以 # 開始

# this is comment

多行註釋:

=pod
this is comment
this also is comment
=end

包和類

包和類本質上都是一個名稱空間,包中可以定義新的函式和變數。類定義的函式,預設第一個函式是一個在這個名稱空間中定義的引用。

(my $var (new class-name))

如果是包,有必要定義一個連線到這個包名稱空間的變數嗎?

(my $var (new package-name))

在語言中,需要經常按照型別呼叫相應的函式。多型的內部定義函式,也是為了解決這個問題:

(first 'str')
(first [1,2,3])

而按照型別定義的方法呼叫:

 ('str'.first)
 ([1,2,3].first)

這似乎有些奇怪,但確實簡潔多了。

還有一種呼叫方式:

('str' -> first)
([1,2,3] -> first)

這就是基於訊息的程式碼書寫方式。Spp 是否可以支援呢?

用 newlisp 書寫的直譯器,所有的函式引數都是傳值的,這個限制只能讓 Spp 止步於指令碼行列。要想讓語言更加具有未來的味道,就用 Erlang 來書寫直譯器。增加執行緒等相關特性。

資料型別:Spp 有多種內建資料型別

true => 邏輯真
false => 邏輯假
nil  => 空值 
int  => 數字 (可擴充套件成 64 位數字) 12 -12
str => 字串 "string" 'string' :string
list => 列表,也是表示式 (say "hello world")
array => 陣列 [true, nil, false, 3, "str"] 可巢狀
hash => 雜湊 {:key => 1, :value => 2 }

在併發語言中,佇列的本質上就是陣列。

在 newlisp 實現中,如何實現引用和值引數的傳遞呢? 貌似 PHP 有明確的區分。

(def (foo &$x @y) ((first $x) + @y))

字面量有了,該如何實現呢?用 uuid 生成的不重複名字做 functor 來對映這個引數嗎?

如果用 PHP 來實現呢?能否編譯成 exe 呢?

還是用 C, C++, Golang, 等靜態語言來寫真正的直譯器比較好。

Spp 擅長的是文字處理,那麼就主要在文字處理,資料結構處理方面多準備些函式,讓 Spp 成為一種方便的對語言處理的語言。

可以對語言進行分析,做語法分析語言。

可以對資料結構進行轉換,進行語言轉換。

條件流程語句:

(if (a > b) (say "a > b") else (say "a <= b"))

哨兵迴圈語句:

(while (condition) (do sth))

條件判斷語句:

(case @guide
    (when (condition-1) (expression-1))
    (when (condition-2) (expression-2))
    (default (default-expr)))

函式定義:

(def func-name (@arg-1 @arg-2)
    (exprs-1)
    (return true))

變數宣告:

  (my $var 1)
  (our @var 2)

名稱空間:

 (context Spp)
 (exprssion)
 (end Spp)

引用不同名稱空間的函式或變數:

(package.func x y)

相關文章