lana.k
lana.k

Reputation: 11

How can I convert this list of numbers and symbols into a string?

is there a way too convert a list like this into a normal string? list->string does not work because it isn't a list of chars. It is a bit problematic because the list consists of symbols and numbers :/

(list + 4 * 5 - 3 6) //-> "+4*5-36"

Upvotes: 1

Views: 2498

Answers (2)

alinsoar
alinsoar

Reputation: 15813

I will show you in mit-scheme:


(define input '(+ 4 * 5 - 3 6))

(fold-right (lambda (x acc)
              (string-append ((cond ((number? x) number->string )
                                    ((symbol? x) symbol->string ))
                                    (else (error "unknown case" x))
                              x)
                             acc))
            ""
            input)

Example:

1 ]=>
(define input '(+ 4 * 5 - 3 6))
;Value: input
...
;Value: "+4*5-36"

In case the list contains more kind of symbolic expressions, apart from numbers and symbols, you extend the cond-statement with other cases.

Also, do not forget to quote the input, otherwise + gets evaluated to a strange value.

Upvotes: 0

Sylwester
Sylwester

Reputation: 48775

Standard Scheme

For numbers:

(number->string 123 10) ; ==> "123"

For symbols:

(symbol->string 'test) ; ==> "test"

So you can check what type it is and use the correct procedure to convert to string. You can use string-append so join more strings together.

(string-append (symbol->string '+)
               (number->string 4)
               (symbol->string '*)
               (number->string 5)
               (symbol->string '-)
               (number->string 3)
               (number->string 6))
; ==> "+4*5-36"

If you make a procedure any->string you can make a one level list to string like this with SRFI-1:

(foldr (lambda (e a) (string-append (any->string e) a))
       ""
       '(+ 4 * 5 - 3 6))
; ==> "+4*5-36"

Racket

Racket has format. If you do (format "~a" data) it will produce a string:

(format "~a" '(+ 4 * 5 - 3 6))
; ==> "(+ 4 * 5 - 3 6)"

Note that the first element of (list + 4 * 5 - 3 6) isn't the symbol + since the variable + gets evaluated to a procedure that adds stuff. eg. (+ 3 4) ; ==> 7 and + ; ==> #<procedure:+> (in racket; implementation specific)

Upvotes: 2

Related Questions