乱入2

http://d.hatena.ne.jp/w_o/20050308#p1

PascalというかDelphi
ごめんなさい、上の記述は撤回します。Pascalの場合は「節」があるため節の後ろは一行あけないと気持ち悪いです。Adaは「節」が無いからだらだら書いても違和感無いのですね。
一目瞭然ですがbegin〜endの対応などもPascalとAdaはかなり違います。

program w_o_Pascal;

{$APPTYPE CONSOLE}
{$R+}

uses 
  SysUtils, DateUtils;

type
  CompareMode = (Newer, Older);
  ParseError = class(Exception);

var
  FileName: String;
  TimeStamp: TDateTime;
  InFile: Text;
  Mode: CompareMode;
  C: Char;
  FileHour, Hour: 0..23;
  FileMin, Min: 0..59;

function ReadInteger(Last: Char): Cardinal;
begin
  Result := 0;
  repeat
    Read(InFile, C);
    if C = Last then Break;
    if C in ['0'..'9'] then
      Result := Result * 10 + Cardinal(Ord(C) - Ord('0'))
    else
      raise ParseError.Create('num');
  until Eoln(InFile);
end;

begin
  if ParamCount < 1 then
    WriteLn('usage:')
  else
  begin
    FileName := ParamStr(1);
    FileMode := fmOpenRead;
    Reset(InFile, FileName);
    TimeStamp := FileDateToDateTime(FileAge(FileName));
    FileHour := HourOf(TimeStamp);
    FileMin := MinuteOf(TimeStamp);
    Read(InFile, C);
    case C of
      'n': Mode := Newer;
      'o': Mode := Older;
      else raise ParseError.Create('n/o');
    end;
    Read(InFile, C);
    if C <> ',' then
      raise ParseError.Create(',');
    Hour := ReadInteger(':');
    Min := ReadInteger(#0);
    Close(InFile);
    if (Mode = Newer) = (FileHour * 60 + FileMin > Hour * 60 + Min) then
      WriteLn('ok')
    else
      WriteLn('ng');
  end;
end.

そういえばHaskellでファイル入出力の方法知らないなあ…電卓にしか使ってませんでしたから…。