1

enter code here只需要知道偷看计划的基础知识。我尝试查看球拍网站寻求帮助,但没有太多内容。或者,也许我在寻找错误的部分。无论如何,重点如下。

如果我有 (#\x #\b #\o #\x #\space #\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")))

这样做的问题是它会给我“xbox”的 IDIDIDID(这是代码的原因),但我想让它只为整个单词 xbox 输出一次 ID

4

1 回答 1

1

有一些更简单的方法可以解决这个问题,但它们涉及到一些额外的语言知识。例如,使用正则表达式在空格处拆分字符串mapfilter处理每个单词:

(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(not 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")
于 2012-05-07T04:03:23.157 回答