2012-05-07 35 views
1

enter code here只需要知道在計劃中偷看的基本知識。我試圖尋找球拍網站的幫助,但它沒有太多。或者,也許我在看錯誤的部分。無論如何,這一點是以下幾點。在計劃中偷看?

如果我有 (#\ X#\ B#\ o#\ X#\空間#\ 3#\ 6#\ 0)

我希望能夠識別x作爲炭和然後繼續窺視直到達到空間並將其重新定義爲單詞。然後做同樣的360.

任何提示? 請和謝謝你! :)

這裏是我的代碼是什麼樣子的情況下,它可以幫助

(define (work x) 
(cond 
((null? x)(write '$$)) 
(char-numeric? (car x)) 
(write 'Num) 
(toke (cdr x))) 
((char-alphabetic? (car x)) 
(write 'ID) 
(work (cdr x))) 
(else (write "other"))) 

這裏的問題是,它會給我IDIDIDID爲「的Xbox」(這使得代碼感的原因),但我想讓整個單詞只輸出一次ID xbox

+0

什麼是「偷看」?通過重新定義#\空格作爲單詞,你是什麼意思?你想用這些數字做什麼?您問題中的列表由字符組成,#\ space#\ 3#\ 6#\ 0是所有字符。如果你明確地寫出給定輸入的預期輸出,會更好。 –

+0

我的意思是以下內容, 如果我有(#\ x#\ b#\ o#\ x#\ space#\ 3#\ 6#\ 0)我希望能夠寫出該xbox是一個詞,360是一個數字。 這個問題的關鍵在於分析第一個字符,如果它是字母的,那麼我使用peek-char直到遇到空格或文件結尾。這樣我可以說這個詞是xbox,不是x是一個詞,b是一個詞,o是一個詞,x是一個詞。 我在網上閱讀了有關peek-char的信息,球拍網站上沒有太多內容。 我能解釋一下自己嗎? – Ceelos

+0

我們需要更多的上下文。你的輸入是字節串嗎?這是家庭作業項目的一部分嗎?有沒有理由不能使用正則表達式? –

回答

1

有更簡單的方法來解決問題,但它們涉及一些額外的語言知識。例如,使用regular expressions用於拆分在空格的字符串和map and filter用於處理每個字:

(define line "xbox 360") 

(define (process line) 
    (map (lambda (word) 
     (cond ((string->number word) "number") 
       (else "word"))) 
     (filter (lambda (str) 
       (not (equal? str ""))) 
       (regexp-split #px"\\s+" line)))) 

注意,輸入接收到的是含有在輸入文件中的行(由過程file->lines作爲返回的 )。總的想法是:逐行讀取文件,並用上面的代碼片段依次處理每一個文件。

如果您在代碼中使用更高級的功能還可以,上述操作就可以實現。

編輯:

我只使用列表迭代read-char(不peek-char,其內容只有第一個字符,並且不前進到下一個)寫了一個版本,但你會看到這個遠遠複雜得多上述過程就明白了:

(define (process line) 
    (let ((port (open-input-string line))) 
    (let loop ((char (read-char port)) 
       (acc '())) 
     (cond ((eof-object? char) 
      (cond ((null? acc) '()) 
        ((string->number (list->string acc)) (list "number")) 
        (else (list "word")))) 
      ((char-whitespace? char) 
      (cond ((null? acc) 
        (loop (read-char port) '())) 
        ((string->number (list->string acc)) 
        (cons "number" (loop (read-char port) '()))) 
        (else 
        (cons "word" (loop (read-char port) '()))))) 
      (else 
      (loop (read-char port) (cons char acc))))))) 

預期以下測試這兩種解決方案的工作:

(process "xbox 360") 
> '("word" "number") 

(process "1") 
> '("number") 

(process "a") 
> '("word") 

(process " ") 
> '() 

(process "") 
> '() 

(process " a b 1 a ") 
> '("word" "word" "number" "word") 
+0

謝謝奧斯卡,這將是我在計劃中的第三天,所以我對語法仍然很陌生,但我會試着理解你在給予我以後的工作! – Ceelos

+1

@Ceelos我用'peek-char'寫了另一個解決方案,你會發現它是可能的,但是比我原來的解決方案更加複雜和難以理解。 –

+0

哇,這令人印象深刻。 我追蹤了一下,可以看到它是如何工作的。我將在我的代碼中實現這個概念。再次感謝奧斯卡! – Ceelos