• Чем отличаются друг от друга функции, процедуры и операторы(на примере FreePascal)?

    OCTAGRAM
    @OCTAGRAM
    Процедуры не возвращают результат, функции — возвращают.

    $X (eXtended syntax)
    Эта разница осложняется тем, что Паскаль после Вирта чаще портят, чем делают лучше. И, например, сделали возможным выбрасывать результат функции и вызывать функцию как процедуру. В Delphi это регулируется директивой $X (eXtended syntax), который паровозом меняет сразу много всего, и нельзя по отдельности только запретить выбрасывать результат. Паровозом становится нельзя образаться к результату по имени переменной Result. Казалось бы, можно пользоваться Exit(значение), но компилятор начинает глючить, когда тип значения record с управлением владением. И буфер символов array[0 .. 1023] of Char становится сложнее превратить в строку. Также становится обязательно использовать каретку для разыменования указателей. Смешались в кучу кони, люди. Куча синтаксических отличий переключается одной директивой, и сделано так, что с выключенной директивой толком жить не получается. Может быть, в FPC иначе, там свои глюки.


    Что касается операторов, в русском языке есть путаница переводов слов, которые в английском языке сильно не похожи. Хорошие переводчики разрешили эту путаницу таким образом, что statement = оператоР, а operator = операЦИЯ. Но не все переводчики согласовали глоссарий.

    Оператор (statement) — это:
    • пустой оператор
    • присваивание
    • вызов процедуры
    • составной оператор begin оператор; оператор; … end;
    • прочие операторы, как goto, raise, try, if, for, while, repeat


    Операция (operator) — это:
    • сложение, вычитание, умножение, деление
    • сравнения
    • логические и побитовые операции and, xor, or, not
    • битовые сдвиги shl, shr
    • явные и неявные приведения типов


    В Delphi 2006 и выше для объявления собственных операторов используется синтаксис class operator. У Free Pascal тоже был свой синтаксис собственных операторов.

    Здесь может быть путаница, потому что в Pascal не все операторы являются честными операторами, как должно быть. Например, Exit, Break и Continue не являются синтаксически простыми операторами, а являются операторами-вызовами процедуры, и расположены эти специальные процедуры в модуле System, так что полное имя System.Exit тоже сработает.

    Автор учебника, наверное, думает, что Read и ReadLn, наоборот, являются простыми операторами. Но нет. Это процедуры из модуля System, на которые навешана магия компилятора, чтоб они принимали разные параметры, но эта магия не делает из них операторы. Хотя вызов процедуры — это формально оператор.
    Ответ написан
    Комментировать
  • Чем отличаются друг от друга функции, процедуры и операторы(на примере FreePascal)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Функции и процедуры - почти одно и то же. Различие лишь в том, что функция возвращает значение, а процедура - нет. Очевидно, функцию можно использовать, как процедуру, если просто игнорировать возвращаемое значение. Поэтому в других языках обычно даже не вводится такое понятие, как процедура. А в Си-подобных языках, где функция обязана иметь возвращаемый тип, используется тип void, что тоже как бы делает функцию процедурой.

    Говоря о функциях или процедурах, акцент ставится на сам механизм вызова - указатель текущего места выполнения помещается в стек, управление передаётся функции, и по её завершении указатель восстанавливается из стека и выполнение программы продолжается с того же места. Таким образом, имеются в виду два момента: 1) сам вызов функции 2) расположение тела функции в другом месте памяти. То есть функция - по сути подпрограмма.

    Оператор же - по сути отдельная самостоятельная инструкция. Обычно их можно менять местами на одном уровне вложенности, и это не добавит синтаксических ошибок. Однако сама по себе инструкция может быть не только простой, но и сложной, составной. Например, целый блок, или условный оператор, или цикл. Таким образом, оператор может содержать в себе другие операторы. Это надо понимать, чтобы не запутаться в терминологии. Говоря об операторах, акцент ставится на том, что код - это последовательность инструкций, которые выполняются одна за другой. Обращение к функции (её вызов) - это тоже оператор в том смысле, что это отдельная инструкция.
    Ответ написан
    1 комментарий
  • В чем разница halt(0) и halt(1)?

    OCTAGRAM
    @OCTAGRAM
    Если запустить из bash:

    ./MyProgram && echo True || echo False

    То для Halt(0) сработает echo True, а для Halt(1) сработает echo False

    Ещё так можно в bash писать:

    set -e
    ./Generate_ORM ...
    gprbuild ...
    7z a ...
    sftp ...
    ssh ...


    Здесь set -e устанавливает режим нетерпимости к ошибкам. Каждый перенос строки или точка с запятой работают как два амперсанда. В этой цепочке если что-то не отработало нормально, дальше исполнение не продолжается. Если исходники не сгенерились, нет смысла их компилировать, а если не скомпилировались, то нет смысла упаковывать скомпилированное, а не если не упаковалось, то нет смысла заливать на сервер, а если не залилось на сервер, то нет смысла удалённо перезапускать сервер. Как правило, кодом завершения процесса программа сообщает, что она не справилась.
    Ответ написан
    Комментировать
  • Поможет ли функциональный ЯП (например, Haskell) лучше понять ООП (С++)? Если да, то чем конкретно он поможет?

    vabka
    @vabka
    Токсичный шарпист
    ФП - очень крутая парадигма. В теории, может помочь понять ООП, через взгляд со стороны, но не факт.
    Знание в принципе полезное и оправдывает затраченное время.
    Но я бы посоветовал взять какой-нибудь более простой язык, чем хаскель - например F# (тем более он объединяет ООП с ФП).
    Или раст - он тоже имеет черты обоих парадигм, но с ним тоже есть свои нюансы.
    Хотя если хочется совсем мозг сломать - берите Idris и погружайтесь в доказательное программирование.
    Ответ написан
    Комментировать
  • Поможет ли функциональный ЯП (например, Haskell) лучше понять ООП (С++)? Если да, то чем конкретно он поможет?

    Adamos
    @Adamos
    Знакомство вообще не помогает. Помогает - использование.
    Вам есть, где применить Хаскель? Если нет - не тратьте время впустую.
    Лучше всего понять ООП, особенно в С++, помогает работа в С++ с использованием ООП.
    Ответ написан
    Комментировать
  • Поможет ли функциональный ЯП (например, Haskell) лучше понять ООП (С++)? Если да, то чем конкретно он поможет?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Нет. Скорее помешает.

    Это принципиально разные парадигмы. В функциональной парадигме основа - чистые функции, никакого стейта. ООП основано на внутреннем состоянии классов, которое постоянно меняется.
    Ответ написан
    2 комментария
  • Чем отличаются команды :w! file и :w newfie в редакторе VIM?

    sashkets
    @sashkets
    Прекратил отвечать после 24.02.2022
    :w!
    принудительная запись (знак ! в команде) открытого файла если у владельца нет прав на запись. ( напр. права у файла r-xr-x-r-x)
    :w newfie
    а-ля Save as
    Ответ написан
    Комментировать
  • Полезно ли изучить или познакомиться с редактором Vi перед изучением Vim?

    Jossnix
    @Jossnix
    tester
    Полезно ли изучить или познакомиться с редактором Vi перед изучением Vim?

    Нет. Лучше сразу работать с Vim. Разница там не такая уж и большая (сложность входа одинаковая). Если разберётесь с Vim, то сможете и в Vi работать.

    Как вы изучали Vim?

    Набравшись терпения и распечатав шпаргалку с функционалом кнопок.
    Примерно месяц занимало больше времени, чем в предыдущих редакторах/IDE.

    • Сначала использовать только для просмотра кода (изучил навигацию)
      Параллельно правил под свои нужды vimrc
    • Потом начал редактировать, копировать, вставлять, пользоваться автозаменой, регулярками.
    • Затем подобрал плагины для удобной работы.


    В какой программе вы изначально писали код?

    Notepad++, VS, eclipse, sublime
    Ответ написан
    Комментировать