2009-11-02 70 views
4

給定表達式'(lambda(x)x)如何將其轉換爲字符串。我認爲符號 - >字符串將完成這項工作,但沒有它不能符號。將方案表達式轉換爲字符串

例如,對於宏字符串: (到字符串(拉姆達(x)x)),應返回>> 「(拉姆達(x)x)」

任何想法鄉親感謝

+0

只是澄清我正在處理引用列表。我會走過列表並做字符串連接,但後來我不知道如何處理可變因子e,g'(lambda(x。y)(display x)(display y)) – user200654 2009-11-02 01:02:52

回答

1

你應該穿過這些孔雀。當一個新的缺點開始寫入「(」,當它結束時寫入「)」並在符號內部使用符號 - >字符串作爲符號。

您可以通過類型調度來擴展它。方案中也可能存在漂亮的印花?

+0

感謝Trickster的快速響應。我也想到了這個解決方案,但後來我不知道如何處理可變參數的例子,例如 '(lambda(x。y)(+ x y))如何實際知道。在x和y之間並輸出「(lambda(x。y)(+ xy))「 – user200654 2009-11-02 00:44:52

+0

好,(xy)是(cons x(cons y nil))和(x。y)是(cons xy) – 2009-11-02 01:03:59

1

使用pretty-format

(pretty-format v [columns]) → string? 
+0

不幸的是我使用的Scheme實現沒有實現漂亮格式:(任何其他的替代? – user200654 2009-11-02 00:48:04

4

表達: 「(拉姆達(x)x)

是引用列表。

表達 (拉姆達(x)的x)的

是某種編譯的,不透明的,可執行程序,運行時的內部的對象。

符號 - >字符串只是簡單地將符號轉換爲一個字符串,這是一個字符序列。

如果您使用的是列表,您可以簡單地遍歷列表並打印出各個組件。實際上(寫'(lambda(x)x))只會列出列表。

許多方案都有類似於(with-output-to-string ...),它返回一個寫入標準端口的所有輸出的字符串。但是,如果你這樣做(寫(lambda(x)x)),你會得到誰知道什麼。轉儲可執行函數類型時,您將獲得實現提供的任何內容。有些人可能會打印顯示源代碼的「反彙編」。其他人可能只是打印「#功能」或其他同樣無用的東西。

總之,如果你只是想列出一個列表,有各種各樣的機制。

如果你想打印出一個編譯函數的源代碼,那是一個完全不同的問題,非常依賴於實現,而且可能是不可能的。

5

標準方案(至少在R5RS的意義上)沒有辦法做到這一點,所以如果你想要便攜式代碼,你需要自己走結構。單調乏味,但不是太複雜(即使是虛線列表)。 但是,如果你只想一些工作版本,那麼你應該看看你的實施手冊,並尋找做到這一點的方式。答案几乎總是很簡單,例如,在PLT計劃中,您將使用(format "~s" '(lambda ...))

+0

答案是正確的,雖然支持SRFI 6的實現,你可以做一個輸出字符串端口,並寫入它。 – 2009-11-02 07:19:31

+0

關鍵是,直接這樣做可以在某些情況下更有效。 (是的,參考實現使用srfi-6,但是實現通常會使用他們擁有的任何內置參數 - srfi-26的mzscheme實現只是使用它的格式自己的'格式'。) – 2009-11-02 07:59:18

相關問題