I’m trying to read several inputs at once in STDIN, and I think read/recursive is what I’m looking for. However, it returns a placeholder/eof, and I want it to become a list I can reference after reading. any tips?
@joslarki I think you just want read
Is there a reason that read by itself doesn’t work?
No read does work, I wasn’t wrapping the numbers I input in parentheses. Thanks!
read works just on numbers too
@joslarki If you want to read multiple times, accumulating to a list, you could probably do something like (for/list ([v (in-port read)]) v).
You might first want to (file-stream-buffer-mode (current-input-port) 'none) — input might have line buffering by default.
In which case you won’t see any values until you hit ENTER.
(current-input-port ~= stdin, current-output-port ~= stdout and current-error-port ~= stderr)
I’m trying to read a sequence of numbers that are not parenthesized when they’re input, and I want them to be wrapped in parens so I can pass the instance variable of the read values to a function like filter. Is there a way to do this?
I think I’ve found a solution:
(define (read-list)
(let ([x (read)])
(if (eof-object? x) (list) (cons x (read-list)))))
That’s great you worked it out like that! The (for/list ([v (in-port read)]) v) I mentioned above, will expand to code very similar to your definition of read-list.
I think it’s great when learning Racket to work it out the way you did.
Design recipe :sunglasses:
Thanks for the help Sam and Greg!
I like port->list
is there a reason entering eof into the input reader won’t stop the reader even if I have an eof-object? predicate to catch it?
Maybe the buffering I mentioned above? Does it work if you type ENTER first?
It is throwing an error:
file-stream-buffer-mode: cannot set buffer mode on port
port: #<input-port:interactions from an unsaved editor>
Ah OK that won’t work in DrRacket with the port it sets up to be current-input-port.
I tried ENTER both at the beginning of the stream and end, neither worked.
Ahhh okay
(It would work running your program with command-line racket or Racket.exe)
To the terminal! batman scene change music
FWIW I just tried now with DrRacket 6.10 on macOS and it worked for me. In the Interactions pane prompt I typed 1 2 3 then clicked the yellow EOF button.
(Using your definition of read-list from above, and doing (read-list) to run it.)
I think when it takes eof as an input in read-list it might be getting changed somehow to not be an eof object, but a symbol/datum
clicking the yellow EOF button worked for me as well though!
Oh, you meant you were typing “eof” in the input?
Yes, try that with just a regular call to (read) , it should stop the reader
So, with will work is the DrR “EOF” yellow button, or, (on Unixy systems) typing CTRL+D. As to why typing “eof” did not work…
Try typing some other letters, say, “abc”, and see what read-list returns for that.
Ahh it’s just quoting it?
Bingo.
read is returning a plain data s-expression.
The “eof” is 'eof, i.e. a symbol.
The symbol has no meaning.
When your Racket program is read, expanded, and evaluated, then it might attach some meaning to a symbol such as eof or abc.
“Oh, the environment has a binding for 'eof. It is defined to be this object. So 'eof is also an identifier.”, says Racket.
For fun, you could try changing your read-list to check for (if (eq? x 'eof) (list) (cons x (read-list))) and now it would work.
Well, it would work differently.
I’ll shut up now I think I’m over-explaining this. :slightly_smiling_face:
OK, one other thing I’ll mention. With quoted expressions like '(1 foo "bar"), keep in mind that that’s really a list with the quote distributed across all of the items. Try entering (list '1 'foo '"bar") in the REPL. Racket will print '(1 foo "bar"). Quoting can be confusing early on (at least it was for me).
@lexi.lambda wrote a great answer about this https://stackoverflow.com/questions/34984552/what-is-the-difference-between-quote-and-list
I work for c311 at IU and am definitely going to use that when explaining symbol lookup. :smile:
Thanks for your time!
@joslarki Um, “I work for c311 at IU” sounds like it means I was telling you a lot you already know. Sorry. :smile:
I didn’t mean to sound ungrateful! I couldn’t explain how I knew that it was being quoted in a way that is as understandable as the description you gave. This is the beginners channel as well, and I think it could be useful to more than just myself.
Oh, no, I didn’t mean to say you sounded ungrateful. Instead, I get embarrassed/cringey when I realize I’m motor-mouthing old news to someone.