Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dotted lists cause reader-errors #4

Open
mmtorni opened this issue Jul 9, 2023 · 1 comment
Open

Dotted lists cause reader-errors #4

mmtorni opened this issue Jul 9, 2023 · 1 comment

Comments

@mmtorni
Copy link

mmtorni commented Jul 9, 2023

Reading dotted lists cause reader-errors. Test case:

(with-input-from-string (stream "(:head . :tail)")
		   (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
		     (read stream)))

Expected output:
(:HEAD . :TAIL)
Output (sbcl):
dot context error [Condition of type SB-INT:SIMPLE-READER-ERROR]

The problem seems to be READ-MAYBE-READ-MACRO uses CL:READ-DELIMITED-LIST to read the rest of the list, which does not handle dotted lists.

@mmtorni
Copy link
Author

mmtorni commented Jul 9, 2023

Here are fiveam test cases for dotted lists. These pass with the standard readtable.

[Edit: Fixed the first test cases to use FIVEAM:IS, added float test cases]

(test dotted-list-1
  (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
    (is (equal (cons :car :cdr) (read-from-string "(:car . :cdr)")))))

(test dotted-list-2
  (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
    (is (equal (list* :item1 :item2 :cdr) (read-from-string "(:item1 :item2 . :cdr)")))))

(test dotted-list-tail-too-long
  (signals reader-error
    (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
      (read-from-string "(:car . :cdr :extra)"))))

(test dotted-list-no-tail
  (signals reader-error
    (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
      (read-from-string "(:car . )"))))

(test dotted-list-no-head
  (signals reader-error
     (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
      (read-from-string "(. :cdr)"))))

(test dotted-list-float-1
  (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
    (is (equal (list* :item1 0.5) (read-from-string "(:item1 . .5)")))))
  
(test dotted-list-float-2
  (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
    (is (equal (list :item1 0.5) (read-from-string "(:item1 .5)")))))
  
(test dotted-list-float-3
  (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
    (is (equal (list* :item1 :item2 0.5) (read-from-string "(:item1 :item2 . .5)")))))
  
(test dotted-list-float-4
  (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
    (is (equal (list :item1 :item2 0.5) (read-from-string "(:item1 :item2 .5)")))))
  
(test dotted-list-integer
  (let ((*readtable* (named-readtables:find-readtable 'named-read-macros:readtable)))
    (is (equal (list* :item1 :item2 5) (read-from-string "(:item1 :item2 . 5)")))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant