Первый опыт с Nemerle
От: SergASh  
Дата: 17.08.07 19:55
Оценка:
Привет всем!

Взялся за изучение 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/ ? А то сайт их такой медленный, что невозможно работать.

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.