2011-11-27 35 views
3

所以我正在爲PHP設計一個簡單的微型語言/替代語法。 它的語法需要JavaScript和CoffeeScript很多,包括我自己的一些概念。我已經在PHP中編寫了解析器(不使用解析器生成器)來將代碼轉換爲PHP,然後執行它。它更像是一個概念/學習工具的證明,而不是其他任何東西,但如果我說我不想看到它在某一天的實際項目中使用,我就會撒謊。假設級聯困境

反正這裏是一個小問題我也碰到過,我想我會強加給你帶來很大的知識分子:(。)

當你在PHP中期內知道用於字符串連接。然而在JavaScript中它用於方法鏈接。

現在有一件事情讓我在PHP中感到惱火,就是不得不爲我的方法鏈使用那個血腥的箭頭( - >),所以我去了JavaScript方法並實現了用於對象的句點(。)。

(我想你可以看到已經是問題)

因爲我目前只寫一個「啞巴」分析器,僅僅做了巨大的搜索和替換,沒有辦法區分是否句號(。 )正在用於連接或方法鏈接。 「所以如果你想要像JavaScript一樣使用加法(+)運算符Franky!」,我聽到你尖叫。那麼我會但是因爲加法(+)運算符用於PHP中的數學運算,我只會將自己置於相同的情況。

除非我可以讓我的分析器足夠聰明(用一個垃圾加載工作)知道當加法(+)運算符使用整數時,不要將它轉換爲連接的句點(。)非常擰。

但這裏很酷。因爲這幾乎是一種新語言。我不必使用句號或加法運算符來連接。

所以我的問題是:如果我決定引入一種字符串連接的新方法,那麼最有意義的字符是什麼?

+5

空格字符? – biziclop

+0

如果有人有興趣的項目,我已經把它在這裏: https://bitbucket.org/valordigital/dotvee –

回答

2

它是否必須是一個字符?..可以工作!

任何無數的組合,像~~>:甚至!

+0

不能使用逗號,你怎麼能確定一個帶字符串的函數調用是串聯還是函數調用?即'foo(「stack」,「overflow」,「stackoverflow」);' – nickb

+0

@nickb這是一個好點 – tekknolagi

+1

雙週期'..'實際上可以工作。無論我選擇哪種方式來惹惱某人 –

1

如果你不想使用+或。,那麼我會推薦^因爲它在一些其他語言中用於字符串連接,我不相信它用於PHP中的任何東西。 編輯:有人指出它用於XOR。一種選擇是使用^,因爲按位XOR不常用,然後將其他像^^這樣的其他映射到XOR。另一種選擇是使用..進行連接。問題在於大多數單個字符都被佔用。

另一種選擇是使用+,但將其映射到一個函數,該函數在一個參數是字符串時連接,否則添加。爲了不破壞依賴字符串的東西,這些字符串被視爲數值,我們應該將數字字符串作爲數字用於這些目的。這是我將使用的功能。

function smart_add($arg1,$arg2) { 
    if ($arg1.is_numeric() && $arg2.is_numeric()) { 
     return $arg1 + $arg2; 
    } else { 
     return $arg1 . $arg2; 
    } 
} 

然後a + b + c + d剛剛被變成smart_add(smart_add(smart_add(a,b),c),d)

這可能不是在所有情況下完美的,但它應該工作得很好大部分的時間和有使用明確的規定。

+1

啊哈〜! http://php.net/manual/en/language.operators.bitwise.php :) – deceze

+4

這是[XOR](http://www.php.net/manual/en/language.operators.bitwise.php)運營商。 – nickb

+0

啊,對不起,那。我知道它在C,Java等中用作XOR,但是當我搜索php運營商列表時,我發現的頁面沒有提供。我也有一個替代的,更復雜的解決方案。它會通過編輯添加到帖子中。 –

1

所以我的問題是:如果我決定引入一個新的方法 字符串連接,什麼樣的字符會最有意義?

正如你所知道的,你需要選擇一個不被用作PHP的operators之一的字符。由於字符串連接是一種常用技巧,因此我會盡量避免使用需要按SHIFT鍵入的字符,因爲這些字符會成爲障礙。

而不是試圖爲字符串連接分配一個字符(因爲大多數已經在使用),也許你應該定義自己的字符串連接語法(或任何其他操作,你需要用不同的操作符覆蓋),作爲速記操作員(有點)。類似於:

[$string, $string] 

應該很容易被解析器拾取並形成生成的連接字符串。

編輯:我還應該注意,無論您使用的是文字字符串還是變量,根本無法(據我所知)將此語法與任何其他PHP功能混淆,因爲中間的逗號是數組操作無效。因此,以下所有內容仍將被識別爲字符串連接,而不是其他內容在PHP中。

["stack", "overflow"] 
["stack", $overflow] 
[$stack, $overflow] 

編輯:由於該衝突JSON符號,下面的替代的變化存在:

  1. 更改定界符
  2. 省略定界符

實施例:

[$stack $overflow $string $concatenation] // Use nothing (but really need space) 
+1

我喜歡那裏的事情。唯一的問題是我也用我的數組語法去了JavaScript路線。數組寫成JSON對象。因此,對於多維數組,''[string,string]'轉換爲'array($ string,$ string)'和'{...}'相同。 –

+0

@FrankyChanyau - 如果省略逗號,它將不是有效的PHP語法,可用於表示字符串連接。與刪除逗號時使用相同的語法(即使用空格字符作爲分隔符)是否有衝突? – nickb

+0

你是否正在提議類似於'[stringOne'的另一個字符串'stringTwo stringThree]'?嗯,我會嘗試一下並回復你,我擔心如果我真的很快地掃描代碼,我可能會混淆串聯字符串的數組。從長遠來看,對於多於兩個字符串的串聯而言,它可以節省幾個字符,並且它也是分組連接字符串的好方法。 –