2014-02-08 5 views
2

Я пытаюсь написать простой парсер в Racket, используя parser-tools. Я получил поведение, которое я не мог объяснить (я новичок в 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 

Почему это? Что мне здесь не хватает?

+0

Возможный дубликат [В чем разница между eq ?, eqv ?, equal ?, и = в схеме?] (Http://stackoverflow.com/questions/16299246/what-is-the-difference-between- э-э-равно-и-в-схема) – Sylwester

ответ

2

Как и многие языки программирования, существует разница между тем же объектом и двумя объектами, которые выглядят одинаково. Вы, вероятно, следует взглянуть на вопрос о the difference between eq?, eqv?, equal? and =

Ракетка имеет string=?, который сравнивает строки специфично и может быть быстрее, чем менее специфичны equal?.

Смежные вопросы