Могат ли Pascal модулите да бъдат компилирани като изпълними?

Харесва ми библиотеките ми да се удвояват като изпълними файлове. Желаното поведение е:

$ ./scriptedmain
Main: The meaning of life is: 42
$ ./test
Test: The meaning of life is: 42

Как мога да:

  • Накарайте scriptedmain.p да компилира в scriptedmain двоичен файл?
  • Да се ​​предотврати test.p да изпълнява кода, който е в раздела begin/end на scriptedmain.p?

scriptedmain.p:

unit ScriptedMain;
    interface

    function MeaningOfLife () : integer;

    implementation

    function MeaningOfLife () : integer;
    begin
        MeaningOfLife := 42
    end;
begin
    write('Main: The meaning of life is: ');
    writeln(MeaningOfLife())
end.

Когато компилирам scriptedmain.p с fpc scriptedmain.p, не се създава изпълним файл, защото Pascal открива, че това е единица. Но искам да бъде изпълним файл в допълнение към библиотека.

$ ./scriptedmain
-bash: ./scriptedmain: No such file or directory

test.p:

program Test;
uses
    ScriptedMain;
begin
    write('Test: The meaning of life is: ');
    writeln(MeaningOfLife())
end.

Когато компилирам test.p с fpc test.p, полученият изпълним файл комбинира двете begin/end декларации (НЕ желаното поведение).

$ ./test 
Main: The meaning of life is: 42
Test: The meaning of life is: 42

person mcandre    schedule 13.10.2011    source източник
comment
И така, използвам празна главна програма?   -  person Marco van de Voort    schedule 14.10.2011


Отговори (2)


Не знам каква версия на Pascal използвате, но някои варианти поддържат условна компилация с {$IFC condition} ... {$ENDC}. Може би бихте могли да използвате това във връзка с дефиниране на време за компилиране, за да включите/изключите код, който ви е необходим или не ви е необходим в дадена версия.

person Paul R    schedule 13.10.2011
comment
Не съм запознат с Free Pascal, но трябва да можете да проверите документацията и да видите дали поддържа условна компилация. - person Paul R; 14.10.2011
comment
Има, дори няколко вида. Turbo Pascal, Delphi, Mac Pascal/Codewarrior, каквото искате. - person Marco van de Voort; 14.10.2011

Благодарение на Агер и Жиров в пощенския списък на Free Pascal, успях да изградете работещ скриптиран основен пример с минимални хакове. Публикувано също в RosettaCode.

Makefile:

all: scriptedmain

scriptedmain: scriptedmain.pas
    fpc -dscriptedmain scriptedmain.pas

test: test.pas scriptedmain
    fpc test.pas

clean:
    -rm test
    -rm scriptedmain
    -rm *.o
    -rm *.ppu

scriptedmain.pas:

{$IFDEF scriptedmain}
program ScriptedMain;
{$ELSE}
unit ScriptedMain;
interface
function MeaningOfLife () : integer;
implementation
{$ENDIF}
    function MeaningOfLife () : integer;
    begin
        MeaningOfLife := 42
    end;
{$IFDEF scriptedmain}
begin
    write('Main: The meaning of life is: ');
    writeln(MeaningOfLife())
{$ENDIF}
end.

test.pas:

program Test;
uses
    ScriptedMain;
begin
    write('Test: The meaning of life is: ');
    writeln(MeaningOfLife())
end.

Пример:

$ make
$ ./scriptedmain 
Main: The meaning of life is: 42
$ make test
$ ./test 
Test: The meaning of life is: 42
person mcandre    schedule 14.10.2011