Представьте, что вам прямо сейчас нужно сделать утилиту командной строки, которая должна работать в Linux-дистрибутиве, для прикладных целей. Что вы выберете? Delphi? А если не его, то значит ли это, что Delphi — не прикладной язык программирования?
class Program
{
[STAThread]
static void Main( string[] args )
{
var calc = new Calculator.Interop.Calculator();
calc.Add( 10 );
var result = calc.Add( 100 );
Console.WriteLine( result );
}
}
Вся магия с указателями и прочим скрыта за атрибутными процедурными макросами.
язык без библиотек — это не язык прикладного программирования — и не надо вводить людей в заблуждение
Пожалуйста дайте ссылку на то место, где я говорю, что Rust — это язык без библиотек.
А еще это вранье вдвойне — потому что модель память OLE не натягивается на владение Rust (просто так).
А вам не все равно, OLE-объектом вы оперируете в программе или нет, если результат "натягивается" на то, что вам нужно помимо вашего непосредственного участия? Object Pascal, считайте, повезло, что он имеет такое же представление vtable, как в C++. И что, мы теперь все языки с моделью памяти, отличной от C++, вычеркнем из разряда прикладных?
И где там эти динамические возможности демонстрируются? Я вижу статическую строку 'Excel.Application', вижу статические обращения типа XLApplication.Workbooks — это все написано в самом коде программы. Где динамика-то?
Могу ошибаться, но мне видится, что у Rust немного другой путь.
Если C++ изначально был достаточно целостен, а потом в него сверху накручивались дополнительные фичи (грубо говоря), то Rust изначально имеет стройную концепцию, которая реализована не полностью. Львиная доля сложности языка как раз состоит в понимании исключений и частных ограничений языка, которые сама концепция, кажется, иметь не должна. Отсутствие const generics (скоро будут), отсутствие специализации, отсутствие NLL (уже реализовано), нет HKT ни для типов, ни для лайфтаймов и так далее. У языка очень большая перспектива для развития именно по пути к своему внутреннему концепту, пока реализованному лишь отчасти.
Но даже если потребуется что-то поменять кардинально, то у Rust есть механизм редакций, который позволит внести изменения без необходимости соблюдать обратную совместимость.
Также в Rust-компиляторе разрабатывается слой MIR (mid-level intermediate representation), который в будущем позволит не только менять бекэнд (сейчас используется LLVM), но и "фронтэнд", могут появиться новыя языки, которые будут компилироваться в Rust MIR.
Синтаксис у Раста в целом нормальный. Есть шероховатости, но они постепенно устраняются. Те, кто программируют на Rust, дискомфорта не испытывают. Я думаю вы, как и многие из новичков, путаете "плохой синтаксис" с "непонятная/непривычная семантика". Во всяком случае уже не раз были споры насчет синтаксиса и никто из критиков не предложил лучшего решения для выражения тех же сущностей так, чтобы новый синтаксис не рушил остальные конструкции языка в других местах. Может быть у вас есть конструктивные предложения?
Правила заимствования в Rust, параметрический полиморфизм с тайпклассами (типажами) и алгебраический тип данных с паттерн-матчингом делают этот язык принципиально отличным от C++. Такой "статический анализатор", который есть в Rust, невозможен в текущих версиях C++.
Мы обсуждаем возможности самого языка или имеющиеся библиотеки? Я вам показал, как выглядел бы код на Rust, который привели вы. Есть ли в экосистеме Раста библиотеки для работы с excel — это другой вопрос, к статье отношения не имеющий.
А что вы знаете про коммунизм? То, что модель разработки СПО основана на общественной собственности и на участии самих потребителей в производстве — означает, что результат работы не будет продаваться. Фактически означает, никаких формальных запретов не нужно, просто так работает эта экономическая модель.
Странное дело, я одел один носок на правую ногу, и второй при этом тут же стал левым. Вот смотрел я на эти носки до этого и понять никак не мог, какой из них правый, а какой — левый. В мире точно существует неопределенность.
Хотя… Теперь я точно знаю, какой носок какой. И одеть их по-другому я не могу, ибо не могу изменить прошлое. И мой мотив именно так их одеть, был, похоже, причинно определен. То есть никакой неопределенности и не было...
Из вашего описания трудно понять, что именно требуется. Но как вариант, вы можете создать процедурный макрос для отправки сообщений, который будет при компиляции брать информацию о подписчиках из конфигурационного файла, и генерировать разный код, в зависимости от количества подписчиков.
Здесь проблема не в fn, и не в mut, а в том, что вы принимаете ссылку на указатель. Этот код не назовешь ни тривиальным, ни типичным. И может пояснить, зачем вы указываете лайфтайм у ссылки, который никак не используется?
Представьте, что вам прямо сейчас нужно сделать утилиту командной строки, которая должна работать в Linux-дистрибутиве, для прикладных целей. Что вы выберете? Delphi? А если не его, то значит ли это, что Delphi — не прикладной язык программирования?
Вот вам пример из библиотеки
intercom
, как можно сделать API в Rust для работы с COM-объектами (они тоже основаны на vtable):Rust COM server:
C# COM client:
Вся магия с указателями и прочим скрыта за атрибутными процедурными макросами.
Пожалуйста дайте ссылку на то место, где я говорю, что Rust — это язык без библиотек.
А вам не все равно, OLE-объектом вы оперируете в программе или нет, если результат "натягивается" на то, что вам нужно помимо вашего непосредственного участия? Object Pascal, считайте, повезло, что он имеет такое же представление vtable, как в C++. И что, мы теперь все языки с моделью памяти, отличной от C++, вычеркнем из разряда прикладных?
И где там эти динамические возможности демонстрируются? Я вижу статическую строку
'Excel.Application'
, вижу статические обращения типаXLApplication.Workbooks
— это все написано в самом коде программы. Где динамика-то?Могу ошибаться, но мне видится, что у Rust немного другой путь.
Если C++ изначально был достаточно целостен, а потом в него сверху накручивались дополнительные фичи (грубо говоря), то Rust изначально имеет стройную концепцию, которая реализована не полностью. Львиная доля сложности языка как раз состоит в понимании исключений и частных ограничений языка, которые сама концепция, кажется, иметь не должна. Отсутствие const generics (скоро будут), отсутствие специализации, отсутствие NLL (уже реализовано), нет HKT ни для типов, ни для лайфтаймов и так далее. У языка очень большая перспектива для развития именно по пути к своему внутреннему концепту, пока реализованному лишь отчасти.
Но даже если потребуется что-то поменять кардинально, то у Rust есть механизм редакций, который позволит внести изменения без необходимости соблюдать обратную совместимость.
Также в Rust-компиляторе разрабатывается слой MIR (mid-level intermediate representation), который в будущем позволит не только менять бекэнд (сейчас используется LLVM), но и "фронтэнд", могут появиться новыя языки, которые будут компилироваться в Rust MIR.
Синтаксис у Раста в целом нормальный. Есть шероховатости, но они постепенно устраняются. Те, кто программируют на Rust, дискомфорта не испытывают. Я думаю вы, как и многие из новичков, путаете "плохой синтаксис" с "непонятная/непривычная семантика". Во всяком случае уже не раз были споры насчет синтаксиса и никто из критиков не предложил лучшего решения для выражения тех же сущностей так, чтобы новый синтаксис не рушил остальные конструкции языка в других местах. Может быть у вас есть конструктивные предложения?
Правила заимствования в Rust, параметрический полиморфизм с тайпклассами (типажами) и алгебраический тип данных с паттерн-матчингом делают этот язык принципиально отличным от C++. Такой "статический анализатор", который есть в Rust, невозможен в текущих версиях C++.
Мы обсуждаем возможности самого языка или имеющиеся библиотеки? Я вам показал, как выглядел бы код на Rust, который привели вы. Есть ли в экосистеме Раста библиотеки для работы с excel — это другой вопрос, к статье отношения не имеющий.
Ну, например, так:
А что вы знаете про коммунизм? То, что модель разработки СПО основана на общественной собственности и на участии самих потребителей в производстве — означает, что результат работы не будет продаваться. Фактически означает, никаких формальных запретов не нужно, просто так работает эта экономическая модель.
Крупнейших может быть не один, но в таком случае говорят о "крупнейших", а не о "крупнейшем".
А что за закон? Можно поподробнее?
Странное дело, я одел один носок на правую ногу, и второй при этом тут же стал левым. Вот смотрел я на эти носки до этого и понять никак не мог, какой из них правый, а какой — левый. В мире точно существует неопределенность.
Хотя… Теперь я точно знаю, какой носок какой. И одеть их по-другому я не могу, ибо не могу изменить прошлое. И мой мотив именно так их одеть, был, похоже, причинно определен. То есть никакой неопределенности и не было...
Из вашего описания трудно понять, что именно требуется. Но как вариант, вы можете создать процедурный макрос для отправки сообщений, который будет при компиляции брать информацию о подписчиках из конфигурационного файла, и генерировать разный код, в зависимости от количества подписчиков.
Из этого описания — ничерта не понять.
А в чем ошибка-то? Логические ошибки можно допустить в любом языке. А то, что работать с указателями в Java "трудно", то это правда.
Да, после такого особенно больно...
Назовите язык, в котором нельзя говнокодить.
Сигнатура функции должна быть такой:
Здесь проблема не в
fn
, и не вmut
, а в том, что вы принимаете ссылку на указатель. Этот код не назовешь ни тривиальным, ни типичным. И может пояснить, зачем вы указываете лайфтайм у ссылки, который никак не используется?Да, "упаковку" не в Rust придумали: https://habr.com/ru/post/328052/