Результатом функции 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 ) )"