標籤:

Rail詳解

Rail詳解

來自專欄編程語言專欄

老司機帶帶我


沒錯啦

這個語言需要極強的鐵路知識

這卻是一個語言

以下內容大多來自維基百科


認識一下代碼

$ main (--): -[Hello World!
]o-#

首先,第一行固定有一個$,這是火車入口

後面用包著函數名稱

當然,這個語言必須有main函數

不然……

之後的東西,用(A -- B)表示

表示這個函數的調用值和返回值

A,B都是列表形式呈現,右邊為頂,左邊為末

當然,main函數調用自己也沒什麼用,就不用什麼值啦

之後便是鐵路

- 橫向| 縱向/ 左撇 右撇* 萬能+ 直向x 偏向這三個接頭表示能通過的鐵路(方向)要變成相反方向就像*讓所有經過它的火車往回走,而+只能對於-|<>^v Y型箭頭,之後談到


首先談談連接

我們知道,

-連接左右

|連接上下

/連接左下和右上

連接右下和左上

有時候會發生這樣的情況

|

這是被允許的

下面是一個摘自維基的圖表,其中P的優先順序最大,其次是LR

當然,LR只能是一種鐵路,而P只要不是空格都能走(我們在函數中會提到)

而且LR不能同時滿足

對於每種鐵路的LPR和LR的對應鐵路

| North: LPR | L = R = /------------------------------------------------------------ | South: | RPL L = R = /------------------------------------------------------------ - East: L -P R L = / R = ------------------------------------------------------------ - West: R P- L L = / R = ------------------------------------------------------------ / Northeast: LP /R L = | R = ------------------------------------------------------------- / Southwest: R/ PL L = | R = ------------------------------------------------------------- Northwest: PR L L = - R = |------------------------------------------------------------ Southeast: L RP L = - R = |


前面提到了$,這裡補充兩個

# 你家火車停站的地方

@ 蹦床類的東西,能將你家火車變向

之後,火車必須從左上角的$出發,向右下角開去

下面就是「人字鐵路」在編程中的運用

$ #--@


接下來Y字鐵路

Y字鐵路長這樣(對於其他方向的自行腦補)

>-/

這時一輛火車從右邊通過,從棧中彈出一個值,若是TRUE就往左走,FALSE往右走,否則或者棧里沒東西,再見,你家火車飛走了


這時,一個神奇的東西出現了(早出現了)

棧!

接下來,我們學習怎麼將東西壓入棧

$ star -[star]-#

ng

這裡的star表示壓入的是一個字元串star,這是對於從左到右說的,若方向相反,會將rats壓入棧

那麼

數字就是將這個數字直接填進去

像[1234567890]

Bool型就將0/1填進去

完美

你可以將左右兩個括弧反過來(什麼)

沒錯啦

只要有一個相反方向的括弧都行

在之後的括弧使用都可以


變數?

$ drop (a -- ) -(!a!)-#

如果不懂(a -- )的自己面壁思過

這是輸入描述和輸出描述,表有一次彈出,沒有推入OK?

這裡用(! !)兩個括弧夾著變數名

之後

這兩個括弧依然能反過來!

定義好一個變數後,棧中將會彈出一個值並填到a里

懂了吧

如何將變數的值推進棧呢?

用( )夾住變數名就好

就像

$ dup (a -- a a) -(!store!)--(store)-(store)-#


中途告訴你一個驚喜

第一行的括弧只是主食O (ΩДΩ)

沒錯啦

接下來講的是函數

函數和main函數要求一樣

$ main -[bottom]-[middle]-[top]-{print-second}-#$ print-second (a b -- b), a gets printed. -(!b!)o(b)-#

你會注意到函數的使用方法

在函數中用{ }包著函數名就好啦

當然,函數的注意事項和main函數是一樣的

就像C++的void

來來來

看看這個

$ broken-function /----# --/

你會覺得沒毛病

走到第二行的/時

火車會不顧一切衝上e

於是……

這便是前面的鐵路談到的問題

系統崩潰的元兇


好了

看看Lambda這個東西

$ main (--): -[hello ](!h!)-[world
](!w!)- | /------------------------------/ | /--&-(w)o-# | -(!l!)-(h)o-(l){}#

此時走到了&,h和w分別儲存hello 和world

注意,這裡的
表示的就是

於是,&將火車彈回去,並且在棧中壓入lambda這個東西(不是字元串)

這裡用l來儲存

此時,如果要將lambda調用,就將l調用,於是

火車將回到&且與目前方向一樣


這裡有維基百科上的一個列表,非常清楚的表示了火車路過特定字元時的動作

系統

b Boom (a --) 結束程序並輸出字元串a

e EOF ( -- a) 檢查輸入,若沒有壓入ture否則壓入false

i Input ( -- a) 壓入讀入的字元,若沒有,那麼崩潰

o Output (a --) 彈出並輸出棧頂字元串

u Underflow Check ( -- a) 推入棧中的元素數量

? Type? (a -- b) 根據a的類型,返回string(字元串),lambda(lambda),nil(0),list(列表)

分隔符

有以下幾大類,在前面說過了

[

]

(

)

(!

!)

{

}

Math

a/d/m/r/s (a b -- c) 計算並壓入a(+/÷/×/%/-)b(一一對應)

0~ 9 Constant number (-- a) 壓入這個數

字元串

c Cut (a b -- c d) 斷開字元串a,前b個字元為c,其餘為d

p Append (a b -- c) 合併a,b兩個字元串為c

z Size (a -- b) 壓入字元串a的長度

列表

n NIL (-- a) 壓入一個空列表

: Cons (a b -- c) 將b放在列表a前形成列表c

~ List breakup (a -- b c) c是a列表中第一個東西,b是其他的

條件

f False (-- a) 壓入false

g Greater than (a b -- c)返回「a大於b」的結果

q Is equal to (a b -- c) 返回「a等於b」的結果(不同形式一定為false)

t True (-- a) 壓入true


好,就講這麼多

有興趣的

$inner parse string ( s -- rs list ) parses the string [a,b,[c,d],e,f] to the corresponding list. Very tolerant of badly formatted strings version! | /------------------------------------------ | | | | | /--(s)1c(!s!)(!c!)---/ | /--(s)z0q< | /--(s)1c(!s!)(!c!)---(c)[[]q< --[]n--# --(!s!)--(s)z0q< --[]n--# --n(!r!)--[](!ws!)--- | /----------------------------------------------------------------------/ /--(ws)(c)p(!ws!)-------------------- | /--(ws)?[list]q< | | / --(r)(ws):(!r!)--(c)(!ws!)---------- | /--[](r)(ws):--# /---------(c)[,]q< | ---(s)z0g< /---(c)[]]q< --(r)(ws):(!r!)--[](!ws!)---------------------------- / --(s)1c(!s!)(!c!)---(c)[[]q< --(s)(r)(ws):--# | | | | /------------------/--(c)(s)p(!s!)--(s){inner parse string}(!ws!)(!s!)--- | --(ws)z0g< | | | --(r)(ws):(!r!)---/ | | | -----------------------------------------------------------------------------------------------------------------------------/

修鐵路吧!


推薦閱讀:

Python中的變數、對象、引用
Python 004-03:字元串全部處理方式
如影隨形的設計模式與現實世界

TAG:編程語言 |