Eu desenvolvi uma linguagem de script pequena e comecei a escrever as primeiras ligações de bibliotecas nativas. Esta é praticamente a primeira vez que escrevo uma extensão nativa para uma linguagem de script, por isso me deparei com um problema conceitual.
Gostaria de escrever um código de cola para bibliotecas populares, para que elas possam ser usadas nessa linguagem e, devido ao design do mecanismo que escrevi, isso é conseguido usando uma matriz de Cs que struct
descreve o nome da função visível pelo máquina virtual, juntamente com um ponteiro de função.
Assim, uma ligação nativa é realmente apenas uma variável de matriz global, e agora devo obviamente dar a ela um nome (de preferência bom). Em C, é idiomático colocar as próprias funções em um "espaço para nome", acrescentando um prefixo personalizado aos nomes das funções, como em myscript_parse_source()
ou myscript_run_bytecode()
. O nome personalizado deve descrever idealmente o nome da biblioteca da qual faz parte. Aqui surge a confusão.
Digamos que estou escrevendo uma encadernação para libcURL
. Nesse caso, parece razoável chamar minha biblioteca de extensões curl_myscript_binding
, assim:
MYSCRIPT_API const MyScriptExtFunc curl_myscript_lib[10];
Mas agora isso colide com o curl
espaço para nome. (Eu até pensei em chamá-lo, curlmyscript_lib
mas, infelizmente, o libcURL não usa exclusivamente o curl_
prefixo - as APIs públicas contêm macros como CURLCODE_*
e CURLOPT_*
, portanto, presumo que isso também atrapalhe o namespace.)
Outra opção seria declarar como myscript_curl_lib
, mas isso é bom apenas enquanto eu for o único que escreve as ligações (já que sei o que estou fazendo com meu espaço para nome). Assim que outros colaboradores começam a adicionar suas próprias ligações nativas, eles agora desorganizam o myscript
espaço para nome. (Eu fiz algumas pesquisas e parece que, por exemplo, a ligação Perl cURL segue esse padrão. Não tenho certeza do que devo pensar sobre isso ...)
Então, como você sugere que eu cite minhas variáveis? Existem diretrizes gerais que devem ser seguidas?
SomeLang_register_extension("curl", "H2CO3", "000.001.000", the_extension)
ondethe_extension
aponta para alguma estrutura de extensão, mas não é visível globalmente. Seu idioma manteria uma estrutura de dados interna para classificar as extensões por nome, versão e autor.