Язык схемы: # вывод ошибок - PullRequest
0 голосов
/ 02 мая 2018

Это моя программа:

(define (listof n m)
(display " ( ")
(let loop ((times n))

   (if (= times 0)
     (display ") ")
     (begin (display m)
            (display " ")
            (loop (- times 1))))))

=> (listof 2 (listof 2 2))

Ожидаемый результат: ((2 2) (2 2)).
Вывод получен: ( 2 2 ) ( # < void> # < void> )

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Поскольку (listof 2 (listof 2 2)) я должен вывести ((2 2) (2 2)) Я уверен, что вы должны создать код, который создает список, и он не имеет ничего общего с печатью . Таким образом, вы не можете использовать display.

Почему? Что ж. Представьте, что если (listof 2 2) должно вывести «(2 2)», то очевидно, что возвращение не имеет значения. Таким образом, тот же вывод, что и display, в порядке. Таким образом, (listof 2 (listof 2 2)) должен отображать (2 2) (? ?), где ? - это то, что возвращает listof.

Если listof должен вернуть список с переданным аргументом, то (listof 2 2) должен вернуть (cons 2 (cons 2 '()). Вы должны переписать вашу процедуру так, чтобы она сделала это вместо этого.

0 голосов
/ 02 мая 2018

Результатом функции listof является # . Это потому, что последнее, что делается, это (display ") "). Это выводит «)» на стандартный вывод, но не возвращает значащее значение вызывающей функции (следовательно, # ). Это означает, что вы не можете таким образом вкладывать вызовы в listof.

Другими словами, чтобы исправить это, вы должны заставить функцию возвращать значащее значение. Вы можете создать строку с помощью строки-добавления, например. Я предполагаю, что вы не хотите создавать настоящие списки здесь, иначе вы должны посмотреть, как работают списки.

Вот пример (этот работает только со строками):

(define (listof n m)
   (let loop ((times n) (res "("))

      (if (= times 0)
         (string-append res " )")
         (loop (- times 1) (string-append res " " m)))))



> (listof 3 (listof 2 "hello"))
"( ( hello hello ) ( hello hello ) ( hello hello ) )"
...