Как я могу преобразовать этот список чисел и символов в строку? - PullRequest
1 голос
/ 13 февраля 2020

есть ли способ преобразовать такой список в обычную строку? list-> string не работает, потому что это не список символов. Это немного проблематично c, потому что список состоит из символов и цифр: /

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

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Стандартная схема

Для чисел:

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

Для символов:

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

Таким образом, вы можете проверить, какой это тип и используйте правильную процедуру для преобразования в строку. Вы можете использовать string-append, поэтому объедините больше строк.

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

Если вы выполните процедуру any->string, вы можете создать одноуровневый список для строки, подобной этой, с помощью SRFI-1:

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

Ракетка

Ракетка имеет format. Если вы сделаете (format "~a" data), то получится строка:

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

Обратите внимание, что первый элемент (list + 4 * 5 - 3 6) не является символом +, поскольку переменная + оценивается процедура, которая добавляет вещи. например. (+ 3 4) ; ==> 7 и + ; ==> #<procedure:+> (в ракетке; спецификация реализации c)

0 голосов
/ 18 февраля 2020

Я покажу вам в mit-схема :


(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)

Пример:

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

Если список содержит больше видов символов c Выражения, кроме чисел и символов, расширяют cond-statement на другие регистры.

Кроме того, не забудьте заключить в кавычки ввод, иначе + получит странное значение.

...