2011-04-23 85 views
2

我想寫一個過程(函數)來檢查一個字符串是否包含另一個字符串。我從http://sicp.ai.mit.edu/Fall-2004/manuals/scheme-7.5.5/doc/scheme_7.html如何在Scheme中捕獲`string-search-forward`的返回值?

閱讀串庫的文檔,從他們根據,

模式必須是一個字符串。搜索 字符串,用於 子字符串模式的最右端。如果成功,則返回 匹配子串的最後一個 字符右側的索引號爲 ;否則,返回#f。

這對我來說很奇怪,因爲返回值是整數或布爾值,所以我應該如何比較我的返回值?

我試圖

(define (case-one str) 
    (if (= #f (string-search-forward "me" str)) 
     #t 
     #f)) 

DrScheme不喜歡它,

expand: unbound identifier in module in: string-search-forward 

感謝,

回答

2

string-search-forward不是標準化的Scheme程序;它是MIT方案實現特有的一個擴展(這就是爲什麼你的鏈接轉到「MIT方案參考手冊」。)要查看只有那些有保證的程序,請看R5RS document

在Scheme中,#f只有值表示「false」,在條件表達式中使用時的任何其他值都表示「true」。因此,將它與任何事物「比較」都沒有意義。在這樣string-search-forward返回混合類型的情況下,你通常捕捉一個變量的返回值進行測試,然後使用它,如果它是不假:

 
(let ((result (string-search-forward "me" str))) 
    (if result 
     (munge result) ; Execute when S-S-F is successful (result is the index.) 
     (error "hurf") ; Execute when S-S-F fails (result has the value #f.) 
)) 

更先進的辦法是使用cond=>條款這是在某種意義上用於上述的縮寫:

 
(cond ((string-search-forward "me" str) => munge) 
     (else (error "hurf"))) 

這種形式(<test> => <expression>)意味着如果<test>是一個真值,然後<expression>進行評價時,其必須是一個參數的過程;這個過程被稱爲<test>作爲參數。

+0

謝謝。我現在明白了。 – Chan 2011-04-23 06:07:01

1

錯誤消息似乎有些奇怪(我沒有drscheme不幸的是安裝這樣做會沒有太多的調查)。

你確定str是一個字符串嗎?

此外=僅用於整數比較,您可以改爲使用false?

至於string-search-forward混合類型的返回值,方案有一個心態,如果任何有用的值可以返回,它應該返回,所以這意味着不同的返回類型是常見的函數。

1

Scheme有一個非常小的標準庫,它既是一個祝福(你可以讓小的方案實現嵌入到應用程序或設備中,你可以快速學習語言)和一個詛咒(它缺少很多有用的功能)。 string-search-forward是麻省理工學院計劃的一個非標準功能,它不存在於DrScheme中。

許多圖書館增加可用SRFIs的形式。 SRFI是社區對基本語言的擴展 - 將其視爲計劃實施的可選部分。 DrScheme(或至少其後繼者Racket)implements many SRFIs

DrScheme有一些字符串函數作爲SRFI 13的一部分。在string searching functions中,有string-contains,除了它的參數是相反的順序之外,它是相似的。

(require srfi/13) 
(define (case-one str) 
    (integer? (string-contains str "me"))) 

你會發現,這兩種實現使用不同的參數順序(表明它們是獨立開發的),但使用相同的返回值。這說明在Scheme中有一個函數根據它傳遞的內容返回不同的類型是很自然的。特別是,如果一個函數能夠完成它的工作,則返回一個有用的信息是相當常見的,或者如果它不能完成工作則返回一個有用的信息。這樣,函數自然地將它的工作(這裏,返回子字符串的索引)與檢查作業是否可行(在這裏測試是否出現子字符串)結合起來。

+0

非常感謝。我希望我能投兩個答案。 – Chan 2011-04-23 06:06:45

相關問題