相等字符串之间的差异

时间:2014-02-08 18:30:54

标签: racket

我正在尝试使用Racketparser-tools中编写一个简单的解析器。我得到了一个我无法解释的行为(我是一个球拍新手,也许这是微不足道的。)

请考虑以下代码:

#lang racket
(require parser-tools/yacc
         parser-tools/lex
         (prefix-in : parser-tools/lex-sre))


(define-tokens value-tokens   ;;token which have a value
  (STRING-VALUE ))
(define-empty-tokens op-tokens ;;token without a values
  (EOF))
(define-lex-abbrevs ;;abbreviation 
  [STRING (:+ (:or (:/ "a" "z") (:/ "A" "Z") (:/ "0" "9") "." "_" "-"))]
  )


(define lex-token
  (lexer
   [(eof) 'EOF]
   ;; recursively call the lexer on the remaining input after a tab or space.  Returning the "1+1")
   ;; result of that operation.  This effectively skips all whitespace.
   [(:or #\tab #\space #\newline)
    (lex-token input-port)]
   [(:seq STRING) (token-STRING-VALUE lexeme)]
   ))

(define test-parser
  (parser
   (start query)
   (end EOF)
   (tokens value-tokens op-tokens)
   (error (λ(ok? name value) (printf "Couldn't parse: ~a\n" name)))

   (grammar
    (query [(STRING-VALUE)      $1])
    )))

(define s (open-input-string 
           "abcd123"))

(define res
  (test-parser (lambda () (lex-token s))))

(define str "abcd123")

在这些定义之后,res是一个字符串:

> (string? res)
#t

同样是str

如果我尝试与"abcd123"字符串执行比较,我会得到两个不同的结果:

> (eq? res "abcd123")
#f

> (eq? str "abcd123")
#t

为什么?我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

您应该将字符串与equal?进行比较。

答案 1 :(得分:2)

与许多编程语言一样,同一个对象和两个看起来相同的对象之间存在差异。您可能应该查看有关the difference between eq?, eqv?, equal? and =

的问题

球拍有string=?,专门比较字符串,可能比不太具体的equal?更快。