
Is there a built-in treemap procedure in Racket? For example: (treemap even? '(1 2 (3 4) 5)) => '(#f #t (#f #t) #f)


Thanks

Oh, I missed the word “built-in”. The answer seems to be no then.

Thanks. I dont use that lib. I have to write by myself.

yeah, it’s easy to write enough

Yes. I just think that procedure is very common.

Is there way to convert a datum (e.g. a list) to a string? For example: '(1 2 3 #t) => "(1 2 3 #t)"
and read a file (whose content is a s-exp) as a string? For example: read this file: a.txt (1 2 3 #b101)
to a string "(1 2 3 #b101)"

Perhaps ~s

E.g., (~s '(1 2 3 #t))
=> "(1 2 3 #t)"

(~s '(1 2 3 #b101))
will return "(1 2 3 5)"
though

What about reverse?

meaning given a string, get an s-exp?

no

given a file (which is an s-exp), read it as a string.

I usually use with-input-from-file

actually, scratch that

for your case, file->string
might be easier

Sorry. if I only have port?

port->string

Thanks. I usually read
from port, but read
always convert a string to sexp.

there are other “read mode”, like read-line
, read-char
, read-string

If the standard read
is used to read an s-expression it will turn "(1 2 3 #b101)"
into (1 2 3 5)
. If you really want some read function to return "(1 2 3 #b101)"
then my best suggestion is to use read-syntax
to read the s-expression. Look at the source location information, which contains information on where the s-expression began and ended in the file. Then reread the piece from the file using read-bytes
or read-string
.

> E.g., (~s '(1 2 3 #t))
=> "(1 2 3 #t)"
Which procedure is shorthand for ~s?

~s is ~s, but I think it stands for “s-exp”

~s is very google unfriendly.

It’s a mode in format
. E.g., (format "~s" 1)

Thanks!



Nice!

Why are you interested in conserving the original form of the s-expression ?

Because the smtlib result from z3.exe has some symbols I want to conserve.

For example, #x123 #b101

oh… you are working with Z3

You should take a look at other libraries that deal with Z3. Such as Rosette

For example, when reading stuff from Z3 process, you can use readtable
to help with reading

I am beginning to think, writing your own read-sexp-to-string
using the primitive read-char
, peek-char
etc. is the best approach.


When writing to Z3, see https://github.com/emina/rosette/blob/master/rosette/solver/smt/enc.rkt
When reading from Z3, in addition to that make-readtable
+ read
, see https://github.com/emina/rosette/blob/master/rosette/solver/smt/dec.rkt

Emina’s code is extremely well-documented, so you should be able to follow it

Thanks.

@sorawee That’s a nice trick! (changing the readtable)

how do you name instances of structs? whenever I have a struct foo
my instinct is to name the variable foo
, but it doesn’t really work in this case

Some people put a-
in front of it

a-dog

I’ve also seen the-
prefix

ah that’ll work, thanks

Tried this a couple of times til it broke constructors/match/etc.—ended up using a
or the
prefixes

I also use a compact version of the struct name sometimes, if it’s intuitive enough. Depends where it sits in the code though

For test, I tend to add a number

Btw - one can use #:extra-constructor-name
to make an extra constructor name. Such as make-foo
.

But you still lose the match-expander if you shadow the struct name, right @soegaard2?

Yes.

It works easier if your struct names are more than one word long. For example, if you name a struct chess-board
then you can use board
for local variables (which are more likely to have a small enough scope that the context makes it obvious what kind of board it is)

You can get the match expander back even if you’re providing the shadowing constructor with a contract. Use define-match-expander
combined with define-module-boundary-contract


but then chess
could be the main struct, with a field called board
:eyes: