Преобразование списка list в список string с использованием синтаксиса-> строка

#scheme #racket

#схема #racket

Вопрос:

В принципе, я хочу '( (whatever1) (whatever2) (whatever3) ... ) ===> ( "(whatever1)" "(whatever2)" "(whatever3)" ) , то есть просто добавить кавычки вне списка и сохранить содержимое списка неизменным. например

 '((define X ::int)
 (define b0 :: bool (=> T (and (= X X) (= 0 0)))))
  

будет преобразовано в:

 '("(define X ::int)"
 "(define b0 :: bool (=> T (and (= X X) (= 0 0))))")
  

Однако следующий код, который я использую, устраняет все пробелы!

 #lang racket
(require syntax/to-string)
(define lst-sub '((define x :: int) (=> T (and (= X X) (= 0 0)))))
(pretty-write (map (λ (x) (string-append "(" (syntax->string (datum->syntax #f x)) ")")) lst-sub))  
  

который возвращает

 ("(definex::int)" "(=>T(and(=XX)(=00)))")
  

Итак, вопрос в том, что пробелов больше нет!
Как я могу обойти это??

Ответ №1:

 #lang racket
(define lst-sub '((define x :: int) (=> T (and (= X X) (= 0 0)))))
(pretty-write (map (λ (x) (format "~s" x)) lst-sub))
  

Комментарии:

1. Боже мой! 2 строки! Полностью пропустил ФОРМАТ (не часто использовал его в Racket :(… Какой урок! Обоими способами 🙂

Ответ №2:

Хорошо. Я не выбираю «легкий» маршрут, о котором думал. и разработано следующим образом, что в итоге приводит к большему количеству строк кода:(

 (define (toString-with-space data)
  (match data
    [(? symbol?) (string-append (symbol->string data) " ")]
    [(? number?) (string-append (number->string data) " ")]))


(define (flat-def def-lst)
  (if  (empty? def-lst)
      (list)
      (begin
        (let ([f (car def-lst)])
          (if (not (list? f))
              (cons (toString-with-space f) (flat-def (drop def-lst 1)))
              (append (list "(") (flat-def f) (flat-def (drop def-lst 1)) (list ")"))))))) 

(define (lstStr->lstChars lst-str)
  (for/fold ([l empty])
     ([el (in-list lst-str)])
     (append  l (string->list el))))


(define flat (flat-def ' (define b1 :: bool (=> (and (= X x) (= Y y)) (and (= Y y) (= X x))))))
(set! flat (append  (list """ "(") flat (list  ")" """))) 
(set! flat (lstStr->lstChars flat))
(set! flat (list->string flat))
(display flat)