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:編程語言 |