2017-05-06 109 views
1

新計劃和目前正在使用詞法分析器。以下是我的代碼,我收到錯誤 map:合同違規 預計:列表? 給出:# 說法位置:第二 其他參數...: #計劃詞彙分析器

#lang racket 

(define tokens '((dog noun) 
       (cat noun) 
       (chases verb) 
       (the article))) 

(define (getToken word) 
    (cadr (assq word tokens))) 

(define ttw (lambda (l) 
    (map getToken l))) 

(define (parse-sentence list) 
    (article list)) 


(define (article list) 
    (if (eq? (car list) 'article) 
     (begin 
      (display "Article: ") 
      (display (car list)) 
      (noun (cdr list)) 
     ) 
     (begin 
      (display "Not an Article!!!") 
      (display (car list))) 
     )) 

(define (noun list) 
    (if (eq? (car list) 'noun) 
     (begin 
      (display "Noun:") 
      (display (car list)) 
      (noun (cdr list)) 
     ) 
     "Not a noun!!!") 
     ) 

(begin 
    (display "Enter a Sentance in(): ") 
    (let ((input (read))) 
     (ttw (parse-sentence input)))) 

我輸入(狗追貓了)

+1

預期產量是多少? –

回答

2

程序運行後,我看到DrRacket顏色這個表達式紅色:

(map getToken l) 

其是功能的一部分

(define ttw (lambda (l) 
    (map getToken l))) 

而且由於錯誤是

map: contract violation 
    expected: list? 
    given: #<void> 
    argument position: 2nd 
    other arguments...: 

我們現在知道,ttw調用與void作爲輸入,而不是一個列表預期。

ttw哪裏叫?點擊「Check Syntax」圖標(帶放大鏡的複選標記),然後將鼠標懸停在ttw上可顯示所有用途。

的唯一用途是:

(ttw (parse-sentence input)) 

這意味着parse-sentence返回void。讓我們來看看的parse-sentence定義:

(define (parse-sentence list) 
    (article list)) 

好了,所以誤差必須在article

(define (article list) 
    (if (eq? (car list) 'article) 
     (begin 
      (display "Article: ") 
      (display (car list)) 
      (noun (cdr list))    
     ) 
     (begin 
      (display "Not an Article!!!") 
      (display (car list))) 
     )) 

在這裏,我們看到:

(if ... 
    ... 
    (begin 
      (display "Not an Article!!!") 
      (display (car list)))) 

將構建begin返回值最後一個表達式。這裏(display ...)返回void

檢查輸出,我們在錯誤消息之前看到右邊:

Not an Article!!!the 

所以問題是不是列表中的其他article回報的東西。

但是,既然您發現了一個錯誤,我建議您看看功能error。例如:(error 'article (~a "Not an article, got: " (car list))。如果您使用error DrRacket會直接告訴您在article中發現了錯誤。