Racket 相等字符串之间的差异
我正在尝试使用Racket 相等字符串之间的差异,racket,Racket,我正在尝试使用解析器工具在Racket中编写一个简单的解析器。我有一种我无法解释的行为(我是一个球拍新手,也许这是微不足道的) 考虑以下代码: #lang racket (require parser-tools/yacc parser-tools/lex (prefix-in : parser-tools/lex-sre)) (define-tokens value-tokens ;;token which have a value (STRIN
解析器工具
在Racket
中编写一个简单的解析器。我有一种我无法解释的行为(我是一个球拍新手,也许这是微不足道的)
考虑以下代码:
#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
为什么呢?我在这里遗漏了什么?您应该将字符串与
相等的字符串进行比较。
与许多编程语言一样,同一个对象和两个看起来相同的对象之间存在差异。你可能应该看看关于
Racket具有专门比较字符串的功能,可能比不太专门的equal?
可能的