LINUX.ORG.RU
Ответ на: комментарий от static_lab

thus providing for the first time, the capability to flexibly treat linked lists in a general-purpose high level language

Ну это вообще ржомба, т.к. в ЛИСПе давным давно списки были вшиты в язык. Cons для них шутка какая-то?

Считалось, что это небезопасно

На это в те времена всем было глубоко насрать.

В общем, премию дали потому что надо было дать «за заслуги». Придумали повод.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Ну это вообще ржомба, т.к. в ЛИСПе давным давно списки были вшиты в язык

Лисп не считался тогда «general-purpose language». Никто бы не стал тогда использовать его и для научных расчётов, и для расчёта зарплаты.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

В 2000? Или в 1964? Очень даже считался в обоих случаях.

Никто бы не стал тогда использовать его и для научных расчётов

Так и PL/1 тоже никто не стал бы в 64 использовать для научных расчётов. К тому же он был очень жирным, а реализации малоэффективными. Потому и сдох в течение 10 лет. ЛИСП нисколько не проигрывает в этом соревновании на непригодность для большинства.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Или в 1964? Очень даже считался в обоих случаях.

Только в академической среде, а для коммерческого успеха нужны были прикладные решения.

К тому же он был очень жирным, а реализации малоэффективными. Потому и сдох в течение 10 лет.

Он-то сдох, а его концепцию указателей успешно переняли более лёгкие и эффективные языки.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

для коммерческого успеха нужны были прикладные решения

Прикладные решения в 64 это ФОРТРАН и КОБОЛ. А ПЛ/1 мертворождённое поделие от ИБМ.

концепцию указателей успешно переняли более лёгкие и эффективные языки

А концепция в чём заключается? Чтобы вместо условного LDA (R1), писать A = *R1?

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

А концепция в чём заключается? Чтобы вместо условного LDA (R1), писать A = *R1?

Конечно, нужен же высокоуровневый язык. А ещё оказались нужны node->left->right.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

Конечно, нужен же высокоуровневый язык. А ещё оказались нужны node->left->right

Это и в ЛИСПе делается на cons. В целом, ещё раз повторю что это просто выражение косвенной адресации средствами ЯВУ. Как конкретно это выражается, определяется особенностями синтаксиса конкретного языка. Но в целом это все те же яйца, вид сбоку и ничего принципиально нового в этом нет.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Есть у них адрес переменной внутри. Умный указатель это структура/класс, в котором есть поле с обычным указателем. А автоосвобождение происходит за счёт деструктора, который это поле читает и делает delete (в случае с shared_ptr деструктор сначала уменьшает счётчик ссылок и только если он стал 0 делает delete). Деструктор это фича языка (которой нет в C).

KivApple ★★★★★
()
Ответ на: комментарий от no-such-file

Там было хитроумно устроено в целях оптимизации, но в целом да, тип был понятен.

Был в целом понятен, или компилятор проверял, что именно поместили в нужную ячейку списка?

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

или компилятор проверял

Да, компилятор проверял. Проверки некоторых типов (числа) были более оптимизированы. В целом был механизм plist (он и сейчас есть, но немного другой) который позволял определять для переменной любые «свойства» в т.ч. и тип. Туда помещались например размерности массивов и т.п. метаинформация.

no-such-file ★★★★★
()

Народ ударился в обсуждение дебрей PL/1, что конечно никак не помогает ответить на этот простой вопрос. Поскольку вы являетесь IT начальником, хоть и в модельном бизнесе, вы можете что-то знать или слышать про обычные указатели, или переменные, значение которых содержит адрес памяти. «Умный указатель» - это абстрактный объект, который помимо адреса содержит дополнительную информацию о контексте, к которому этот адрес принадлежит. Дополнительная информация может использоваться для ручного или автоматического управления указателями, что может помочь избежать стандартные ошибки, характерные для программирования с использованием обычных указателей. Всё это можно прочитать в открытых источниках, нафармить скор помогает написание новостей, о чём я вам говорил в другом обсуждении. :)

VIT ★★
()
Ответ на: комментарий от VIT

не помогает ответить на этот простой вопрос

Как будто кому-то был нужен ответ. ТС пришёл пофлексить и это очередная тема «срывающая покровы».

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

В целом был механизм plist (он и сейчас есть, но немного другой) который позволял определять для переменной любые «свойства» в т.ч. и тип. Туда помещались например размерности массивов и т.п. метаинформация.

Но это динамическая информация для пользовательских целей, не?

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

это динамическая информация

Да. ЛИСП динамический язык вообще.

для пользовательских целей

Не совсем. Тогда plist использовался «для всего». Это потом появились отдельные слоты и отдельные внутренние тэги и заголовки типов. Тогда всё было по-простому. Только числа и cons отличались по тэгу (биту), или диапазонам адресов (что было недоступно для пользователя).

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от static_lab

Лисп не считался тогда «general-purpose language». Никто бы не стал тогда использовать его и для научных расчётов, и для расчёта зарплаты.

Смотри как я могу Gemini может:

;;; =================================================================
;;; IDENTIFICATION DIVISION.
;;; PROGRAM-ID.  PAYROLL-SIMULATOR.
;;; PURPOSE.     COMPUTE EMPLOYEE NET PAY WITH A COBOL FLAVOR.
;;; =================================================================

(defpackage :cobol-payroll
  (:use :cl))

(in-package :cobol-payroll)

;;; -----------------------------------------------------------------
;;; DATA DIVISION.
;;; FILE SECTION.
;;; WORKING-STORAGE SECTION.
;;; -----------------------------------------------------------------

;; Имитируем структуру сотрудника (аналог записи 01 ИМЯ-ЗАПИСИ. 05 ... PIC ...)
(defstruct employee
  (id        0   :type integer)
  (name      ""  :type string)
  (hourly-rt 0.0 :type short-float)
  (hours-wkd 0.0 :type short-float))

;; "База данных" сотрудников
(defparameter *employee-table*
  (list (make-employee :id 101 :name "Иванов И.И."   :hourly-rt 45.00 :hours-wkd 40.0)
        (make-employee :id 102 :name "Петров П.П."   :hourly-rt 50.00 :hours-wkd 45.5) ; сверхурочные!
        (make-employee :id 103 :name "Сидоров С.С."  :hourly-rt 35.50 :hours-wkd 38.0)))

;; Константы для расчета (Аналог 77 TAX-RATE PIC V99 VALUE 0.13)
(defconstant +tax-rate+ 0.13 "Подоходный налог 13%")
(defconstant +standard-hours+ 40.0 "Стандартная рабочая неделя")
(defconstant +overtime-factor+ 1.5 "Коэффициент переработки")

;;; -----------------------------------------------------------------
;;; PROCEDURE DIVISION.
;;; -----------------------------------------------------------------

(defun calculate-payroll ()
  "Основной процесс расчета зарплаты, стилизованный под COBOL отчет."
  
  ;; DISPLAY HEADER
  (format t "~A~%" (make-string 69 :initial-element #\-))
  (format t "COMPANY PAYROLL REGISTER                      DATE: 2026-06-02~%")
  (format t "~A~%" (make-string 69 :initial-element #\-))
  (format t "~V:A ~V:A ~V:A ~V:A ~V:A ~V:A~%" 
          6 "ID" 15 "NAME" 10 "GROSS" 10 "OVERTIME" 10 "TAXES" 10 "NET PAY")
  (format t "~A~%" (make-string 69 :initial-element #\=))

  ;; Инициализация итоговых переменных (Аналог 77 TOTAL-NET PIC 9(7)V99)
  (let ((total-gross 0.0)
        (total-tax   0.0)
        (total-net   0.0))

    ;; PERFORM UNTIL END OF TABLE
    (dolist (emp *employee-table*)
      (let* ((hours (employee-hours-wkd emp))
             (rate  (employee-hourly-rt emp))
             (reg-hours (min hours +standard-hours+))
             (ot-hours  (max 0.0 (- hours +standard-hours+)))
             
             ;; Расчеты (Аналог MULTIPLY, ADD, COMPUTE)
             (reg-pay   (* reg-hours rate))
             (ot-pay    (* ot-hours rate +overtime-factor+))
             (gross-pay (+ reg-pay ot-pay))
             (tax-amt   (* gross-pay +tax-rate+))
             (net-pay   (- gross-pay tax-amt)))

        ;; Accumulate totals
        (setf total-gross (+ total-gross gross-pay)
              total-tax   (+ total-tax tax-amt)
              total-net   (+ total-net net-pay))

        ;; DISPLAY DETAIL LINE (Форматирование масок PIC $99,999.99)
        ;; ~6D - целое число (6 знаков), ~15A - строка (левое выравнивание)
        ;; ~,2F - число с плавающей точкой и 2 знаками после запятой
        (format t "~6D ~15A  $~7,2F  $~7,2F  $~7,2F  $~7,2F~%"
                (employee-id emp)
                (employee-name emp)
                gross-pay
                ot-pay
                tax-amt
                net-pay)))

    ;; DISPLAY TOTALS
    (format t "~A~%" (make-string 69 :initial-element #\-))
    (format t "TOTALS                         $~7,2F             $~7,2F  $~7,2F~%"
            total-gross total-tax total-net)
    (format t "~A~%" (make-string 69 :initial-element #\=))
    
    ;; STOP RUN
    (values)))

;; Запуск программы
(calculate-payroll)

Вывод:

---------------------------------------------------------------------
COMPANY PAYROLL REGISTER                      DATE: 2026-06-02
---------------------------------------------------------------------
ID     NAME            GROSS      OVERTIME   TAXES      NET PAY   
=====================================================================
   101 Иванов И.И.      $1800.00  $   0.00  $ 234.00  $1566.00
   102 Петров П.П.      $2412.50  $ 412.50  $ 313.62  $2098.88
   103 Сидоров С.С.     $1349.00  $   0.00  $ 175.37  $1173.63
---------------------------------------------------------------------
TOTALS                         $5561.50             $ 723.00  $4838.51
=====================================================================

Магия наверное :)

necromant ★★★
()
Ответ на: комментарий от static_lab

Что-то начали цитировать и не закончили. Его статья «PL/I List Processing» June, 1967 Communications of the Association for Computing Machinery https://dl.acm.org/doi/pdf/10.1145/363332.363344

Статья написана в 1966 и что-то там не видно HANDLE. Он в какой версии/диалекте/уровне PL/I появился? Лоусон упомянает LISP, видимо он знал про его существование, видимо его POINTER, за который дали награду, чем-то отличался от остального...

Считалось, что это небезопасно, и следовало пользоваться массивами.

Это уже какая-то отсебятина. Тот же FORTRAN вводил массивы как матрицы/тензоры. Ни в истрория про разработку FORTRAN, ни в описаниях его первых версий нет ни слова про «отказываемся от указателей ради безопасности». А было про то то, что за индексом массива надо следить и программист отвечает, чтобы индекс за границы массива не выходил. Адресации к произвольной памяти из-за выхода индекса за границы массива ничем безопаснее указателя.

mky ★★★★★
()
Ответ на: комментарий от mky

преамбула: в своё время не сразу вьехал зачем в lisp два равенства eq и eq(не помню третьей буквы) - одно равенство по значению — другое буквально тождество обьекта (т.е в реализации совпадение ссылок(али указателей это деталь реализации))

имхо в отличии от индекса(== адресса) в памяти - указатели это концепция языка высокого уровня где есть типы ( даже если базовый тип один - слово в прородителе Сяшки Би)

т.е. до появления типа(или даже вида) указатель была ситуация в асме(машкоде) твори чё хош(ну что машина может) а в hll ( ну там fortran cobol algol lisp - обычный набор подозреваемых) не было сущьностей уровня языка которое можно было бы разименовать и более того не всегда (null именно об отсутсвии субстрата)

в лиспе на уровне s выражений небыло указатлей ( ну да там на уровне реализаци были всякие rplaca али как их там звали) - ибо сборщик муссора просто уйдёт и не вернётся если есть возможность на уровне языка писать что угодно в точечную пару

qulinxao3 ★☆
()
Ответ на: комментарий от necromant

А теперь не на CL, а на LISP 1.5 :)

И насколько эффективно это работало бы в 1960-х на тех компьютерах?

static_lab ★★★★★
()
Ответ на: комментарий от qulinxao3

Уже несколько раз за относительно короткий период времени qulinxao пишет на обычном русском. Правда последние времена чтоль?

anonymous
()
Ответ на: комментарий от anonymous

ща откуриваю волчистость

там забавный коан

мораль привилегия богатых

напомнила анекдот про Декарта(ну не декарт а какойто фран.математик середины просвещения века) когда утомился барчуку потомственному обьяснять доказательство теоремы и в серцах воскликнул «Поверте мне как аристократ аристократу» и не немедленно получил ответ «С этого и стоило начинать»(доказательство)

к слову что курица а что яйцо в под 100к лет существующем человечество мораль али богатсво

qulinxao3 ★☆
()
Ответ на: комментарий от mky

видимо его POINTER, за который дали награду, чем-то отличался от остального

Отличался от тем, что был в PL/1. Т.е. писалось именно «POINTER», а в ЛИСПе писалось «CONS». Это другое (с).

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от necromant

Gemini может:

а он в курсе, что считать деньги в плавучке всегда было мягко говоря дурным тоном?

madcore ★★★★★
()
Ответ на: комментарий от no-such-file

Ты к сырцам статьи приобщить, там всё по заветам Древних Библа входов в одной порции дури; привязка локальных имён к тут же объявлений структуре как прототипу. Красивое

И да гото в диких условиях

В Лиспе была сразу в опкодах ибиме704(0) так что адрес в никуда это не тоже самое что поинтер которое поле прототипца

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)

Умные указатели это объекты, ведущие себя как указатели (обычно у них перегружены операторы *, ->), но также имеющие дополнительное автоматическое поведение, например освобождение памяти в деструкторе. Примеры из стандартной библиотеки: unique_ptr, shared_ptr, weak_ptr.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от necromant

А теперь тоже самое, но на компе 64 года. Лисп даже по-сегодняшниим меркам - тормоз хуже яваскрипта и питона. Что уж говорить про тогда.

anonymous
()
Ответ на: комментарий от no-such-file

В LISP 1.5 Programmer's Manual. MIT Press, Cambridge, Mass., 1962. написано много. В начале вобще всё абстрактно, никаких указателей. А когда ближе к релизации, то список там два адреса — addr. и decrement. При этом cons не позволяет сделать что угодно с этим адресами, там, допустим, прямо написано, что колцевые списки (circular lists) не разрешены.

Лоусона с своей статье как хочет играет с «POINTER», и кольцевые списки и всё прочее. И сразу даёт функцию ADDR(x), возвращающую указатель на x.

Так ведь и индекс в массиве можно назвать указателем, тоже через какие-то адресные регистры работает...

mky ★★★★★
()
Ответ на: комментарий от mky

Так ведь и индекс в массиве можно назвать указателем

Более того, в Фортране так и сделано. Что, как не явная передача указателя в

subroutine A( A1 )
REAL A1(1)
A(10)=5.0
RETURN
END

Корректная Фортран-66 программа. Любители кричать про out-of-bound бегут нафиг в припрыжку.

VIT ★★
()
Ответ на: комментарий от VIT

Это я знаю. Там, в приниципе, всё неявная передача указателя, ведь в подпрограммы параметры передаются by-refernce. Но напрямую указателей в старом Фортране нет, а в новом они заметно другие, чем все привыкли.

mky ★★★★★
()
Ответ на: комментарий от anonymous

А теперь тоже самое, но на компе 64 года. Лисп даже по-сегодняшниим меркам - тормоз хуже яваскрипта и питона. Что уж говорить про тогда.

Может мне сразу вам перфокарты прислать?! :)

Вот пример возможного - сервер на уровне Go по производительности на Lisp: Woo - High Performance Common Lisp Web Server

Если руки прямые, то язык уже вторичен.

necromant ★★★
()
Ответ на: комментарий от mky

Но напрямую указателей в старом Фортране нет

То есть нет слова такого? Это совсем не важно. Важно, что функциональность есть и Cray pointer, продвинутый в стандарт Fortran-90 там как собаке пятая нога. Их и не использует никто, потому что если хочешь делать как в Си, возьми Си и не парь мозги, а если хочешь делать как в Фортране, то и явные поинтеры не нужны.

Нужно просто понять, что в Фортране связывание адреса с объектом происходит при вызове процедуры.

VIT ★★
()
Ответ на: комментарий от necromant

Может мне сразу вам перфокарты прислать?! :)

Если уже будете вставать, и мне копию, пожалуйста! :)

VIT ★★
()
Ответ на: комментарий от VIT

а если хочешь делать как в Фортране, то и явные поинтеры не нужны.

Да тут, как бы обсуждается не нужны/не нужны, а правильность IEEE награды Гарольду Лоусону за концепцию указателей.

Указатели в языке типа Фортран, где есть только массивы не особо нужны/удобны. Указатели хорошо — когда есть объединения/агрегаты данных/структуры. А в Фортране адище начинается, когда там в массиве пытаются хранить что-то сложное. Один массив содержит индексы другого и т.д. В массив как-бы запихивают структуру, но имён полей нет, понимать такой код зубодробильно. EQUIVALENCE там не докрутили, нельзя в подпрограмме элементами массива присвоить имена (переменные).

mky ★★★★★
()
Ответ на: комментарий от mky

Указатели хорошо — когда есть объединения/агрегаты данных/структуры.

COMMON блок используется в точности для этого.

Один массив содержит индексы другого и т.д.

Да, неявная адресация - один из способв адресации в старых машинах. И ввод сегментов ничего не изменил.

понимать такой код зубодробильно

Это by design. 6 первых символов в качестве распознаваемых создаёт массу интересных трудно находимых багов.

нельзя в подпрограмме элементами массива присвоить имена

И это by design. У переменной уже есть имя.

VIT ★★
()
Ответ на: комментарий от anonymous

знаю чем умный отличается от прекрасного

прекрасные указатели были в языке BLISS-36, можно писать указатели на биты в слове например

STRUCTURE
BITVECTOR[I; N] =
[(N+35)/36]
(BITVECTOR+I/36)<I MOD 36,1,0>;
anonymous
()
Ответ на: комментарий от mky

был не взлетевший Plex Росса https://en.wikipedia.org/wiki/Douglas_T._Ross#Plex

структуры в дедоФортране плодововыгодней «колоночно» каждое поле в свой массив

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от anonymous

имхо не помню где

было ваще по красоте имя это просто Адрес(может глобальный может на стеке локально )

и тогда A=.B+C

это поместить по адресу А сумму адреса С и содержимое адреса B

современная общепривычная нотация которую пытались починить l-value и r-value пояснением исходно попытка сохранить для машины с модифицируемой памятью привычные из алгебры плюшки где уравнения обычно это логическая связка между именованными сущностями а не частная модификация через вычисление выражения.

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

Ну с этим то (Douglas Taylor «Doug» Ross) всё понятно:

Later in Ross's life, this became something of an obsession. In the 1980s, he minimized his role at SofTech to concentrate on developing Plex[37] into a wide-ranging pseudophilosophy touching on epistemology, ontology, and philosophy of science.[38] Ross wrote a wealth of material on Plex,[37] delivering lectures at conferences and holding an abortive seminar at MIT in 1984.

Автор Plex всех достал, никакой ему премии :)

каждое поле в свой массив

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

mky ★★★★★
()
Ответ на: комментарий от olelookoe

мудрый указатель понимает бессмысленность указаний и поэтому никому ни на что не указывает.

NULL??

AndreyKl ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария