Есть ли способ переопределить основную функцию модуля в языке программирования D? - PullRequest
4 голосов
/ 18 октября 2011

Если вам действительно нужно, вы можете указать __attribute__((weak)) в C (см. scriptedmain ).Это позволяет программе удваиваться как API и исполняемый файл, позволяя коду, импортирующему API, перезаписывать основную функцию.

Есть ли способ у D?Python имеет if __name__=="__main__": main(), но синтаксис weak в Си кажется намного ближе.

Ответы [ 3 ]

6 голосов
/ 18 октября 2011

Да, используя директивы версии, которые требуют специальных опций для rdmd и dmd.

scriptedmain.d:

#!/usr/bin/env rdmd -version=scriptedmain

module scriptedmain;

import std.stdio;

int meaningOfLife() {
    return 42;
}

version (scriptedmain) {
    void main(string[] args) {
        writeln("Main: The meaning of life is ", meaningOfLife());
    }
}

test.d:

#!/usr/bin/env rdmd -version=test

import scriptedmain;
import std.stdio;

version (test) {
    void main(string[] args) {
        writeln("Test: The meaning of life is ", meaningOfLife());
    }
}

Пример:

$ ./scriptedmain.d
Main: The meaning of life is 42
$ ./test.d
Test: The meaning of life is 42
$ dmd scriptedmain.d -version=scriptedmain
$ ./scriptedmain
Main: The meaning of life is 42
$ dmd test.d scriptedmain.d -version=test
$ ./test
Test: The meaning of life is 42

Также опубликовано на RosettaCode .

2 голосов
/ 18 октября 2011

Я считаю, __attribute__((weak)) - это расширение GNU, которое выдает специальные инструкции компоновщика для слабой компоновки, поэтому оно очень специфично для цепочки инструментов. В этом AFAIK нет ничего в DMD, но другие компиляторы D (GDC или LDC) могут поддерживать расширения своих бэкэндов.

0 голосов
/ 19 октября 2011

Во IIRC есть способ заставить код компилироваться в библиотеку, а не в объектный файл. Из-за способа, которым компоновщик ищет вещи, вы можете использовать его для получения того же эффекта; Просто поставьте цель с основным, который вы хотите использовать, первым в порядке ссылки.

...