Привет всем!
Взялся за изучение Nemerle и появились вопросы в большом количестве. В качестве примера решил написать простую программу для вычисления размера каталога файловой системы:
using System.Console;
using System.IO;
module Applicaion
{
DirectorySize( path : string ) : long
{
DirectorySize( DirectoryInfo( path ) );
}
DirectorySize( directoryInfo : DirectoryInfo ) : long
{
DirectoryFilesSize( directoryInfo.GetFiles() ) + DirectorySubdirectoriesSize( directoryInfo.GetDirectories() );
}
DirectoryFilesSize( fileInfos : array[FileInfo], index : int = 0 ) : long
{
if ( index < fileInfos.Length )
fileInfos[index].Length + DirectoryFilesSize( fileInfos, index + 1 )
else
0L
}
DirectorySubdirectoriesSize( directoryInfos : array[DirectoryInfo], index : int = 0 ) : long
{
if ( index < directoryInfos.Length )
DirectorySize( directoryInfos[index] ) + DirectorySubdirectoriesSize( directoryInfos, index + 1 )
else
0L
}
Main() : void
{
def targetPath = @"D:\Temp";
WriteLine( $"Scanning $targetPath ..." );
def lengthInBytes : decimal = DirectorySize( targetPath );
def lengthInMegaBytes = lengthInBytes / 1024 / 1024;
WriteLine( "Directory size: {0:F1} Mb", lengthInMegaBytes );
WriteLine( " {0} bytes", string.Format( "{0:N}", lengthInBytes ).Replace( ".00", "" ) );
WriteLine( "Press any key to exit." );
ignore( ReadKey() );
}
}
Это мой первый опыт с неимперативным языком, не считая универовских шалостей на ДОСовском лиспе и прологе, так что просьба сильно не пинать, хотя совету по упрощению этого чуда я был бы рад. Не знаю, насколько получилось в духе ФП.
А вопрос такой. Глянул я в рефлектор и обнаружил, что никакой там оптимизации хвостовой рекурcии нет и в помине, хотя как минимум одна из этих функций явный претендент на такую оптимизацию. Я что-то не так понял?
И ещё один вопрос, более важный. Как можно получить offline версию документации, той что живёт по адресу
http://nemerle.org/doc/ ? А то сайт их такой медленный, что невозможно работать.
Спасибо.