Про неймспейсы.
Feb. 9th, 2012 08:29 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Как известно, система пакетов Common Lisp является одним из его наиболее "слабых" и наименее продуманных мест.
Так вот, я тут думаю, какую бы систему неймспейсов добавить в свой Microlisp(и соответственно, во встроенный лисп, используемый в программе, которую я пишу для стартапа).
И вот такой возник вопрос:
Какая система разрешения имен неймспейсов вам кажется более удобной, логичной и продуманной:
Как в C++ или как в C#?
Конкретно, вот что я имею ввиду:
В C# чтобы заюзать вложенные неймспейсы мы должны указывать их имена полностью.
Т.е.
Каждая директива using интернит в текущий юнит компиляции только типы из неймспейсов, но не вложенные неймспейсы.
В то же время, в C++ вложенные неймспейсы тоже интернятся.
Т.е. мы можем писать:
Другой пример:
Если не интернить System::IO, то если, допустим, у нас в этом пространстве имен есть класс Stream, в C++ мы можем обращаться к нему как к IO::Stream. В C# же нам пришлось бы прописывать его полное имя, т.е. System.IO.Stream.
Подход из C++, возможно, позволяет писать меньше букв. Но, в то же время, C# полностью исключает возможность конфликта имен неймспейсов.
Так вот, что по вашему, логичнее, и вообще, лучше?
Кстати, в Microlisp еще будут алиасы пространств имен и символов, как в том же C#.
Т.е. для каждого юнита компиляции(вообще, в микролиспе процесс разрешения имен символов будет связан именно с юнитами компиляции(т.е. грубо говоря, с файлами), а не только с самими пакетами/неймспейсами, как в CL) можно будет делать что-то типа (use-symbol microlisp:io:file-device "fdev"), и потом писать (make-instance 'fdev) и т.д., а fdev будет превращаться reader'ом в символ file-device из неймспейса microlisp:io
Кстати, в комментах приветствуются мысли про неймспейсы и пакеты "вообще". Т.е. в каких языках система пространств имен нравится, и т.п.
Так вот, я тут думаю, какую бы систему неймспейсов добавить в свой Microlisp(и соответственно, во встроенный лисп, используемый в программе, которую я пишу для стартапа).
И вот такой возник вопрос:
Какая система разрешения имен неймспейсов вам кажется более удобной, логичной и продуманной:
Как в C++ или как в C#?
Конкретно, вот что я имею ввиду:
В C# чтобы заюзать вложенные неймспейсы мы должны указывать их имена полностью.
Т.е.
using System;
using System.IO;
Каждая директива using интернит в текущий юнит компиляции только типы из неймспейсов, но не вложенные неймспейсы.
В то же время, в C++ вложенные неймспейсы тоже интернятся.
Т.е. мы можем писать:
using namespace System;
using namespace IO;
Другой пример:
Если не интернить System::IO, то если, допустим, у нас в этом пространстве имен есть класс Stream, в C++ мы можем обращаться к нему как к IO::Stream. В C# же нам пришлось бы прописывать его полное имя, т.е. System.IO.Stream.
Подход из C++, возможно, позволяет писать меньше букв. Но, в то же время, C# полностью исключает возможность конфликта имен неймспейсов.
Так вот, что по вашему, логичнее, и вообще, лучше?
Кстати, в Microlisp еще будут алиасы пространств имен и символов, как в том же C#.
Т.е. для каждого юнита компиляции(вообще, в микролиспе процесс разрешения имен символов будет связан именно с юнитами компиляции(т.е. грубо говоря, с файлами), а не только с самими пакетами/неймспейсами, как в CL) можно будет делать что-то типа (use-symbol microlisp:io:file-device "fdev"), и потом писать (make-instance 'fdev) и т.д., а fdev будет превращаться reader'ом в символ file-device из неймспейса microlisp:io
Кстати, в комментах приветствуются мысли про неймспейсы и пакеты "вообще". Т.е. в каких языках система пространств имен нравится, и т.п.