Химия и PascalABC.Net

Я там уже смотрел, как-то вот не впечатлило. Похоже, массово получать из SMILES список и количество атомов мало кому интересно. Химики “читают” картинку и так, если что - есть разовые утилиты, а всем остальным оно просто не нужно. Иначе было бы куда больше разных статей и упоминаний в “хемоинформатике” по этому поводу.

Современный примитив значит что это что то на уровне += по простоте и применяемости.

Это для посвящённых! :slight_smile: Я когда читал об этих функциях, то многократно встретил термин “синтаксический сахар”, но суть лямбда-функции пока от меня ускользает. вполне возможно, что это тот случай, когда понимание приходит с опытом. Пока это выглядит как способ сокращения количества кода. Похоже, это как в языке: начинающий изучать какой-либо язык старательно выговаривает все фразы в предложении, а носитель просто говорит “Hi!” и всем понятно, что он хотел сказать. Странные параллели наблюдаются.

Кстати, читая вашу интересную переписку по поводу подключения Бабеля, я подумал, что интересно было бы написать книгу в формате решения задачи “чайником” и с комментариями “профи”. Что-то в стиле “Древа познания” Умберто Матураны и Франсиско Вареллы. Такие книги привлекают внимание, так как позволяют показать “кухню” какого-либо процесса. Просто профессиональные книги читать трудно - профессионал быстро устаёт от общения “чайниками” и не видит тех проблем, которые действительно мешают учебному процессу. Кстати, в для Питона таких книг написано несколько. например, “Python Programming for Absolute Beginner” Michael Dawson. Также, такой подход позволяет создать достаточно неформальную обстановку, которая иногда способствует пониманию.

Не, это не так. у нас биоинформатики пользуют Питон и там собирают такие библиотеки.

Дело в том, что я не работаю с С# и у меня на компьютере отсутствует MS Visual Studio. Посему в области использования “чужих” .dll опыта нет. Они для меня либо подключаются и работают без проблем, либо не подключаются вовсе и тогда приходится обращаться к другим участникам форума.

Питон не является .NET языком, поэтому для него библиотеки пишут на C++. А С++ намного древнее C#, как и Python (родился в 1999г.) древнее PascalАВС.NЕТ. Отсюда и проблемы с отсутствием библиотек - для С# они, скорее всего, не востребованы.

Рискну предположить, что Вы материал читали “по диагонали”. Суть “лямбд” весьма проста, если Вам понятна суть обычных функций, ведь лямбда-функция - просто функция, которая создается в коде “на лету”. Да, у нее несколько иной способ записи параметров - но и только.

Вот Вам три странички из будущей книги, быть может, они что-то прояснят: Книга 2-2 A5.pdf (507,0 КБ)

1 лайк

В лямбда-функции больше всего меня озадачивает то, как машина понимает, что я от неё хочу? Вот этот процесс затормаживает! Это как пытаться сразу говорить с носителем языка. Когда говоришь с немцем на английском, то ты понимаешь, что он твои конструкции воспринимает однозначно, а когда с носителем, то очень мешает осознание того, что он чувствует оттенки и смысловые многоплановые посылы. Лично меня это всегда внутренне напрягает. Так и с лябда - когда код написан пошагово, то создаётся ощущение однозначности. Да, поймите меня правильно! Я совершенно не предъявляю каких-то претензий к программрованию (это абсурд), я делюсь впечатлениями неофита. Думаю, тут дело в практике.

Возможно, Вас просто смущает декларативная парадигма, предполагающая указание ЧТО нужно сделать, вместо того чтобы растолковывать в императиве КАК это делать. Если Вы попросите восьмиклассника написать уравнение окислительно-восстановительныой реакции и расставить там коэффициенты, скорее всего, Вам придется сначала ему рассказать, как это делается. Если Вы попросите сделать то же своего коллегу, ситуация будет иной. Вас удивляет, что современные технологии программирования уже выросли из своих коротких штанишек?

На самом деле, “машина” (точнее, компилятор) вовсе не демонстрирует чудес понимания. Когда Вы, имея динамический массив A типа real (а это уже означает, что индексы массива начинаются от 0, что у массива можно напрямую узнать его длину и тип элементов), подаете его на вход некоторой функции Count (а она умеет подсчитывать и возвращать количество элементов в массиве, удовлетворяющих некоторому условию), компилятору остается всего лишь найти такую запись функции Count (а у него есть большой выбор), для которой входом служит именно динамический массив типа real и принять от Вас условие выбора. Все варианты Count ожидают запись этого условия в виде лямбда-функции, что и требует такую функцию записать. И все! A где-то внутри Count все равно сидит цикл, в котором для каждого элемента будет вызываться эта самая функция. Никакой магии, никаких таинств.

1 лайк

Всё просто. Сахар это то, чем посыпают поверх, чтоб было слаще.

В программировании - это паттерны, которые преобразуются в другой код при компиляции.

К примеру обычная лямбда (тык сюда):
begin
  Arr(1,2,3).Where(i->i.IsOdd).Println;
end.

Разворачивается в:

// вместо lambda1 - какое-то уникальное имя
function lambda1(i: integer) := i.IsOdd;

begin
  Arr(1,2,3).Where(lambda1).Println;
end.

Но на самом деле лямбды на много мощнее, потому что умеют захватывать переменные:

begin
  var need_odd := ReadBoolean('true=odd, false=even: ');
  Arr(1,2,3).Where(i->i.IsOdd = need_odd).Println;
end.

Тут, получается, переменная не_из_подпрограммы используется внутри лямбды.
Вот код в который разворачивается лямбда, захватывающая что-либо:

type
  // вместо lambda_container_1 - какое-то уникальное имя
  lambda_container_1 = class
    need_odd: boolean;
    
    // вместо lambda_1 - какое-то уникальное имя
    function lambda_1(i: integer) := i.IsOdd = self.need_odd;
    
  end;
  
begin
  var c := new lambda_container_1;
  c.need_odd := ReadBoolean('true=odd, false=even: ');
  Arr(1,2,3).Where(c.lambda_1).Println;
end.

В целом да. Но в случае тех же лямбд - есть кое что важнее:

Имя подпрограммы, в которую разворачивается лямбда - не засоряет пространство имён файла.
То есть, к примеру, их не будет показывать в Ctrl+Space. Таким образом код становится на много чище и читабельнее.

Между языками речи и языками программирования больше общего, чем вы можете себе представить :wink:

Если что - я не против и попробовать. Всё лучше, чем комментировать коды однообразных чайников на куберфоруме))

4 лайка

Введение к книге (черновик).

Рабочее название “Зачем вам учиться программировать? Краткий курс для безнадёжных биологов”.

Идея этой книги родилась спонтанно на одном из форумов по программированию. На тот момент я о данной области имел весьма поверхностные представления и интерес к программированию у меня был вызван скорее необходимостью, чем что-то иным. Хотя, конечно, это не вся правда - львиную долю в этом желании играла зависть (как бы стыдно в этом не было признаться), природу которой я постараюсь объяснить.

На тот момент я имел большой опыт экспериментальной лабораторной работы в области химии, нейрофизиологии и генетики, был кандидатом наук, что, конечно, питало мою самонадеянность в освоении новой области.

Если у вас уже есть опыт экспериментальной работы в больших проектах, то вы, конечно, поймёте о чём я буду писать далее, а если вы только планируете участие в чём-либо подобном, то вам будет интересно почитать.

Современная биология, химия и все смежные и пограничные области этих знаний, невозможны без экспериментальной работы. В большинстве случаев ваш эксперимент будет сильно отличаться оттого, что вы делали на практических занятиях по химии в школе. Чаще всего современная экспериментальная работа представляет собой невероятно рутинную, утомляющую процедуру, которая с непредсказуемым результатом может растянуться на несколько лет. Ваши друзья, одноклассники и просто знакомые, кто решил жить нормальной жизнью, в это самое время будут двигаться по карьерной лестнице, путешествовать, жениться, менять машины и прочее и прочее, а вы будете монотонно травить плодовых мушек эфиром, считать волоски на их тщедушных тельцах и рассаживать по пробиркам со сладкой кашей. Через некоторое время, особенно если планируемый результат не был получен в первый год, вы начнёте задавать себе различные неприятные вопросы… но к тому моменту бросить начатое уже невозможно! Даже если вы всё бросите и найдёте уже, наконец, себе обычную работу, то вы в полной мере испытаете на себе эффект Зейгарника: вы будете помнить каждую вашу муху «в лицо»!

Но вот случилось чудо и вы смогли довести свой эксперимент до конца. Вами получены результаты, которые обессмертят ваше имя. Растущий Хирш… приглашения на симпозиумы… цитирование и гранты… мираж счастливой научной жизни так реален!

Осталось дело за малым… Необходимо опубликовать ваши данные в хорошем журнале! Да, публикация в журнале с хорошим рейтингом морально компенсирует вам годы каторжного труда и самоистязаний.

Тут мы подходим к главному. Ваши данные надо обработать. Представим, что за несколько лет работы вы провели через эксперимент, например, одну тысячу мух (это не так много, как может показаться). Каждую муху вы проводили в эксперименте отдельно, содержали в индивидуальной ёмкости и вели журнал развития, где подробным образом описывали количество волосков, характер жилкования крыльев и прочее, прочее. Далее представим, что на мухах вы тестировали десть гормоноподобных соединений (это очень мало, но не будем усложнять без особой нужды). Ваши соединения были в разных концентрациях, с различным временем воздействия и подавались мухам на разных стадиях их развития. Дополним наш воображаемый эксперимент гистологическими данными и данным об экспрессии генов в тканях мух и мы получим огромны и трудно осмысляемый массив данных.

Что делать?

Первым делом, конечно (если вы сразу не вели электронный журнал) вы вспоминаете про Excel, однако где-то на двухсотой мухе и восьмидесятой колонке описания вы понимаете, что при таком подходе к обработке данных вы потратите ещё примерно три четыре года.

И тут вы вспоминаете про программистов… и сразу сталкиваетесь с целым рядом существенных осложнений: во-первых, у вас может не быть в знакомых толкового программиста, который способен понять, что такое мускоидный тип ротового аппарата, во-вторых, программист скорее всего и так загружен своими проектами, в-третьих, в-четвёртых…

В любом случае, вы будете чувствовать себя неловко: как маленький мальчик, который просит бабушку почитать интересную книгу. Наблюдая за тем, как ловко ваш знакомый программист будет ворочать огромными массивами своих данных, вы испытаете первый укол той самой зависти и неприятного ощущения собственной неполноценности…

Учитесь программировать сами!

Осознание того, что вы сами сможете обрабатывать ваши данные и быть независимым человеком – может на некоторое время лишить вас сна и вызвать что-то типа лихорадки возбуждения.

Сейчас, скорее всего, это будет забавно читать, но в те времена, когда писалась эта книга, типичный программист выглядел своеобразно: модная стрижка, клетчатая рубаха, цветные татуировки, ухоженная борода и вейп. Всем своим видом типичные программисты излучали уверенность, независимость и прочие признаки закрытой элитарной группы. Они обладали знанием, овладеть которым могли только избранные, а мечты об этом со стороны толстого знатока мух могли вызывать исключительно благожелательную, но неизменно снисходительную улыбку.

И их можно понять! Вы только представьте, если к вам лабораторию придёт программист, поставит на стол свою эксклюзивную термо-кружку и заявит, что хотел бы занятья выведением мух для моделирования болезни Паркинсона. Это было бы странно! Поэтому вам необходимо смириться с тем, что в своём желании овладеть новой для вас технологией вы будете выглядеть чудаком.

4 лайка

У меня, кстати, примерно та же причина погружения в программирование. Не зависть, но желание автоматизировать всё что попадёт под руку.

Мне с детства доставляли вещи которые 1 раз создаёшь, а потом просто сидишь и смотришь как они сами что то делают.
Однажды, в начале 8 класса, мать приказала сделать дз хоть по какому то предмету. Я выбрал информатику, чисто чтоб было что то новое и интересное.

Пока читал основы - вспомнил как в младших классах бесила 1 математическая задачка. Она была простая, но муторная.
Ну и, всё лучше чем делать дз - решил написать программу для автоматизации этой задачки. Написал, запустил, попробовал вводить разные данные.

И, что то, от полученного удовольствия меня так переклинило - что очнулся я уже посреди ночи, поглотив весь материал что был под рукой. И так всё ещё и не отклинило.


Что касается вашего текста - я не большой любитель читать, но тут было сложно остановится. Хоть я и не знаю что такое мускоидный тип ротового аппарата.

Единственное - пару абзацев стоит порезать. А то немного страшно на них смотреть.

2 лайка

Рад,что понравилось. :slight_smile: придётся продолжать…

3 лайка

Ну вроде , если с “налёту/поровоту”. Вам нужен будет словарь двухбуквенных элементов и однобуквенных( с массой).

Принимаемую строку опускаем в нижний регистр или поднимаем в верхний.

Для каждой позиции проверяем это двухбуквенный элемент?

Если нет, то проверяем, однобуквенный ли элемент?

Если после элемента стоит цифра, то умножаем массу на цифру.

Сдвигаем позицию на 1-3 стоки.

Проверяем какой-нибудь пример вручную, как обработает.

Ищем , нет ли примеров записей, который будут неправильно обработаны. Например в примере есть NC12 - там точно 12 углерода?

На двухбуквенных будет глючить.

Да, будет. Я так и написал. Я по первым примерам из вики делал, там как раз однобуквенные.

2 лайка

К сожалению, там все гораздо сложнее. Главное - нет водорода, он “домысливается”. А для этого надо четко определить свободные связи. Кроме того, однобуквенные “большие” и однобуквенные “малые” - не одно и то же.

Я так понял, что С и с -это количество связей углерода. Но с точки зрения количества самого углерода разницы нет.Например

C1CCCCCC1 - это С7H14

А c1ccccc1 - это С6H6

CCCCCCC - это С7H16

Но вот с водородом беда , там уже есть разница С или с. И вообще, боюсь это нетривиальная задача.

Да тут люди вообще компилятор Паскаля написали! :slight_smile:

Только разница в том, что люди, писавшие компилятор, досконально знали предметную область.

1 лайк

Кстати задача не так уже отличная от компилятора/транслятора. Тут как мы выяснили выше упрощённый подход не прокатит, поэтому надо составить полную табличку.

Номер атома. Связан с номером N0 Задействовано X0 cвязей. …(при не обходимости) Связан с номером N1 Задействовано X1 cвязей. и т.д. Тогда все X0 вычитаем из общей валентности и получам число атомов водорода. Но (если я школьный курс ещё окончательно не забыл), валентность может быть переменной в зависимости о того с чем связываемся. И тогда совсем труба.

Также, посасывая палец , я примерно представляю структуру записи так. A(B…)(C…)D это означает, что элемент А связан с элементом B , и одновременно с C и одновременно с D. C(=O)c - это связь углерода(двойная с кислородом) и ещё с углеродом. Только с углеродом непонятно, одинарная или двойная. Запись типа D1 означает что связь в точке 1. Например c1ccccc1 - это кольцо. Но индекс 1 может повторяться, по каком алгоритму “сброс” и 1 обозначает уже другую точку не понятно. А ещё бывают записи типа /C#N N+ (=O)[O-] - значение которых вообще для меня нехимика загадка.

Уважаемые коллеги, существует ли какой-нибудь способ утащить с этого сайта ядро расчёта формул? Они вот ссылку дают на GitHub, но у меня нет опыта работы с этой системой.

Так а что там уметь? Есть файлы, есть папки. На всё можно тыкать чтоб открывать их.
Что лежит где и другую инфу можно найти в файле README.md (который по-умолчанию отображается внизу страницы).

Другое дело, там 4.68 MB .js кода. Проще с 0 написать, чем переводить это всё со скрипта на полноценный язык.

1 лайк