2015-08-19 1 views
1

Я хотел использовать функцию print внутри программы SML для целей отладки для печати данных типа integer list внутри функции и во время выполнения, например. внутри блока let. Однако, как я увидел, print может печатать только данные типа строки. Я не могу дождаться, когда результат вернется, чтобы напечатать то, что я хочу, потому что функция, которую я создал ветвями во время выполнения, и создает много разных списков, и я хочу посмотреть, что представляет собой результирующий список в конце каждой ветви.SML/NJ - распечатать список в середине исполнения

Таким образом, существует ли способ распечатать список внутри функции, так как я бы напечатал строку?

+0

'Я не могу дождаться, когда результат вернется, чтобы напечатать то, что я хочу', так что вы хотите сделать? вам необходимо предоставить хотя бы некоторый демонстрационный код. – HuStmpHrrr

+0

Возможно, я написал это без достаточного разъяснения, но хочу иметь возможность распечатать список, к которому у меня есть доступ, внутри функции, например. в блоке 'let' –

+0

Отредактированный вопрос. –

ответ

2

Если это int list вы можете сделать что-то вроде этого:

fun printIntList ints = app (fn i => print(Int.toString i ^" ")) ints; 

Затем printIntList [1,2,3] напечатает 1 2 3

Вы можете сделать то же самое для других типов.

On edit: Это лучшее, что вы можете сделать с прямым SML. SML/NJ имеет свой собственный extensions, включая «доступ к внутренним компонентам компилятора» и «пользовательскую настраиваемую красивую печать», которая звучит многообещающе, хотя у меня мало опыта с их расширениями к стандартной библиотеке.

2

Простая функция для превращения список Интс в строку:

fun intlistToString []  = "" 
    | intlistToString [x]  = Int.toString x 
    | intlistToString (x::xs) = Int.toString x^", "^intlistToString xs 

Затем вы можете использовать print (intlistToString myList) вместо print myList. Он не будет печатать квадратные скобки вокруг списка, не без лишнего кода, но я оставлю это как упражнение, потому что я ленив.