LINUX.ORG.RU

Lisp: Где применимы cons?

 cons,


1

6

Для начала небольшой «бенчмарк», С без всех оптимизаций в 7406000 раз быстрее.

(defun main ()
  (declare (optimize (speed 3)))
  (let ((n 99999) (l '()) (sum 0))
    (loop for i from 0 to n
	  do (setq l (append l (list i))))
    (setq sum 0)
    (loop for i from 0 to n
	  do (setq sum (+ sum (nth i l))))
    (format t "~d~%" sum)))
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
	long n = 99999, *l = NULL, count = 0, sum = 0;
	for (long i = 0; i <= n; i++) {
		l = realloc(l, (count + 1) * sizeof(long)); 
		l[count++] = i;
	}
	for (long i = n; i >= 0; i--) sum += l[i];
	printf("%ld\n", sum);
}

Для чего же нужны cons? В качестве универсального строительного блока, я считаю это одна из самых худших структур. Все ее преимущества заканчиваются на быстром добавлении в начало. Добавление в конец уже нежелательно, разрез в произвольном месте тоже, так как нету даже быстрого доступа к случайному элементу. Она медленная и неудобная, можно придумать кучу более быстрых и удобных структур. Даже JS на световые годы опережает Lisp со своим JSON, и его частое использование лишь подтверждает его удобство.

Так почему же cons из языка-ассемблера IPL 1956 года считается важным? Да, это неплохая структура для AST, если ваша машина имеет 16 кб памяти, но она распространилась по языку слишком широко.

★★★★★

Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от MOPKOBKA

Почему? if проверяет аргумент (и даже возможно его не удаляет в некоторых версиях Forth), после чего выбирает куда сделать прыжок. Где тут противоречие?

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

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

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

Если так, то ты к концу функции не можешь гарантировать строгое количество, просто не надо создавать такие if-ветки. Это ты опять описываешь ?dup но другими словами, но слова с переменным количеством входов/выходов не являются чем то важным, их и Чарльз Мур критиковал.

Если добавить возможность указывать, сколько аргументов передано функции, то получится ещё один лисп.

И у Forth есть еще одно преимущество, он значительно быстрее даже в очень простой имплементации, например сложение это буквально две операции

add rax, [STACK_REG]
add STACK_REG, 8
Икремент это вообще одна
inc rax

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

И у Forth есть еще одно преимущество, он значительно быстрее даже в очень простой имплементации, например сложение это буквально две операции

В очень простой - да. А уже векторизацию к нему прикручивать или раскрутку списков - адское мучение.

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

Векторизацию легко прикрутить, нужен математический стек, а операции над ним планировать на векторные инструкции. Автовекторизация сложнее. Что такое раскрутка списков не знаю.

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

Это ты опять описываешь ?dup но другими словами

Ну да. То есть ты предлагаешь запретить любые конструкции, которые могут вернуть переменное количество слов. При том, что закрывающая скобка в твоём примере делает именно это.

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

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

Именно так.

При том, что закрывающая скобка в твоём примере делает именно это.

Это системная unsafe-функция.

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

values же не является стеком в стиле forth, и аргументы берутся не из стека, а передаются как 3 атома. Могут быть разные взгляды на то представимо ли это в Lisp, на мой взгляд нет.

rot кстати разворачивается в SBCL намного хуже чем могло бы быть в простой реализации Forth. Я думаю у простой реализации Forth в принципе очень большой запас скорости.

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

слишком ранее связывание тому причиной?! ?

Али срывы конвеера из-за варианта шитости не годного на тех железках

зы. сила скобок в том числе в «морфинге» кода - т.е «self modifing code» универсальным и переносимым образом - что частично взято на вооружение jvm/.net/etc при нативинге на целевой из «сырцов»

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

слишком ранее связывание тому причиной?! ?

По-моему, просто из-за того, что простой компилятор форта написать очень просто, никто не пишет хороший оптимизирующий компилятор форта.

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

gforth ужасен в плане производительности, там используется какая то странная компиляция через gcc, и несколько ужасных решений, аргументируют свои решения они совместимостью.

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

Компиляция в нативный код, примтивный инлайнинг, и верхушка стека в регистре уже даст возможность выполнять на равных, или выигрывать в удачных для Forth функциях у gcc. Факториалы там всякие.

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от monk

никто не пишет хороший оптимизирующий компилятор форта.

потому что форт никому не нужен уже. те проблемы которые решал форт давно исчезли - а именно малый размер памяти и совсем слабый проц.

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

за миллиард лет до конца света или кто останавливает прогресс?

возможно что бы сохранить общую экспансию в ещё не в цифре

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

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

например, у John Walker есть ATLAST который форт, и где-то в репозитории на гитхабе есть пример объектов форта на этом где сделали объекты для автокада плагинами где был этот ATLAST, но там довольно хрупкое все это и наверное сложно воспроизвести:

объекты и классы и классовая война в ClassWar и репозитории github.com/Fourmilab/ClassWar

история автокада в AutoFile

хотя получился бы очередной CyberDog всего этого на http:// atlast forth john walker

лучше конечно бы, это был Xanadu изначальный, векторный и гипертекстовый.

просто удивительно что из-за мисменеждента самого криэйтора Теодора Холма Нельсона он похоже даже не знал что у его заказчика и инвестора Джонни Волкера – был свой собственный метапрог-конструктор на котором все это можно было бы запилить, и даже больше.

впрочем, если сам Джонни Волкер не сумел чтобы обойти intergraph – даже запилить в автокад – из-за непоняток менеждмента (см. историю всего этого ООСАПРа в книжке)

то с Xanadu еще более непонятно. пока они зачем-то скрещивали смоллток с С++ где Gary Wolf и прочие заморачивались над ents and enfilades, затем переписывали опять – (странно, почему сразу Objective C не взяли, или тот же ATLAST/ClassWar) – менедждмент из-за мискоммуникации их уже успел уволить и получилось как с NetScape 4 когда старое уже не работает, а новое еще не работает, и XPCOM-ное окошко с кнопкой писали по полгода в прототипе «правильной» С++ архитектуры.

может, надо было больше в объекты и компоненты – а меньше в С++ понимание этих артефактов?

гомогенизация типа гомоморфизмов где например конкатенация это монада гомоморфизма и например конкатенация строк, списков, деревьев, ropes над деревьями и быстрых агрегатных функций над деревьями

гомогенизируя форт в постскрипт а затем в display postscript и pdf с той же экранной моделью только с хранимыми процедурками c callback вызываемыми NeWS сервером – получили оо субд экранных объектов

но хрупкость форта, постскрипта, возможно меньшая хрупкость фактора но уже с функциональными скобками типа квазицитирования и комбинаторов.

против более умозрительно понятных мейнстриму а потому и им воспринимаемо более масштабируемых мейнстрим-технологий.

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

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

сейчас вот смотрю например на DOOM внутри PDF файла https://github.com/ading2210/doompdf внутри Word файла https://github.com/wojciech-graj/doom-docm , или линукс RISC-V эмулятор внутри PDF файла https://github.com/ading2210/linuxpdf , или Xorg https://github.com/ading2210/xorg-wasm или линукс в хромбуках https://github.com/ading2210/shimboot

и офигеваю. например, тенденция делать не отдельную смотрелку а PDF.js в браузере – это фича или скорее лишняя фича?

опять же, PDF можно было бы использовать в качестве формата EXE или ELF или блекбоксового BBCP .odc файла и гораздо более прозрачным способом, в духе CyberDog-овского OpenDoc/Bento по сути дела, в духе более простых компонентных недообъектов.

но опять же, хрупкость среды всего этого. что если где-то там поставят скобку или запятую или [квазицитирование фактор-слов переменной длины] сломав все эти монадические гомоморфизмы посреди всего этого?

просто офигительные истории

т.е всё большее ориентирование на посторонних в ИТ делает не возможными(пока?) технологии предполагающие ценз пользователей

естественный половой отбор идет одновременно в обе стороны – пока упрощая внешний интерфейс для пользователей или начинающих мейнстрим программистов, бизнес ищет формулу таких программистов которые легко масштабируются. например, плюсы и питон. ценз пользователей уже произошел, ибо мейнстрим программистам достаточно знать только их. то есть, ухудшающий отбор по технологиям для бизнес-ЛПР-ов на самом деле – риск из-за сломавшейся запятой, а улучшающий для них – мейнстрим там где плюсы и питон потому что социальный запрос на мейнстрим лучше масштабируется.

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

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

а не потому что нейросети это что-то новое или прорывное.

просто сейчас – их научились продавать мейнстриму.

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

а то вот например поставил скобку или запятую не там – и все сломалось. то ли дело с++ или питон, например.

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

… computers for masses, not for classes !!! – говорили они.

точнее, говорил Джек Тремиэл – делая Jackintosh на основе Atari ST.

пока классы в это самое время невозбранно пилили себе транспьютеры на ATW800 и Helios

вот чувак пытается собирать FPGA клон той атари машины: ATW800_2 но вообще точка входа тут и вот тут в софты.

целая news группа существует же, comp.sys.transputer

и оживляют эмуляторы, например 1 >> 1.1 и 2

вообще HeliosOS-NG немного Plan 9 напоминает. только Occam более алголо/модуло/меса/цедар подобное.

эмуляторов вообще уйма, просто странно что какой-то Raspbery PI/STM32 не собрали еще в единой сборке.

хотя нет, подожди. T800 и T10000 потом выкупили как раз STM-щики. вообще, там только нормальных линков не хватает по сравнению с.

интересно фольклорное: насколько этимология T800 была навеяна шварцнегерром – а насколько транспьютерами?

в общем, пока публику мейнстримную en masse пугали страшилками – у классов были другие игрушки.

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

метапрог-платформа на «самом себе»

…кстати, там в KRoC есть примеры на SDL через C Foreign interface, но все исходники примерно 2007 года, так что надо раскапывать SDL 1 тех лет чтобы оживить.

так что теоретически если все это оживить – можно запустить метапрог на Occam

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

Turbo C 2.0, BGI graphics, realtime raytracer, мандельброт, вот это все :))

occamdoc оттудова прикольный – просто скрипт на питоне для генерации tangled HTML/XML.

исходное Occam LitProg IDE я так понимаю поддерживало фолдинг – то есть, эти --% {{{ название кодоблока и --% }}} окончание кодоблока полуавтоматически или по кнопке позволяло складывать, как eFTE или zf-команды в vim.

насчет аналогов weave/tangle в KRoC впрочем, не понятно. такое ощущение, что это обычный аналог javadoc/doxygen скорее.

хотя там вроде С прикручивается легко, можно и на tcl/tk что-то подобное запилить.

ATLAST/ClassWar doc/classwar.pdf

или в автокаде 11 досовском тех времен, да :))

жгутики и проводочки на досовом автокаде на форте :)))

и горы фрактальными пейзажами, ога :)))

вот даже два варианта метапрога, со жгутиками и проводочками.

только надо раскопать соответствующее dev окружение чтобы все это сконпелировать и запустить :)))

потом можно взять какую-нибудь реализацию лиспа, например, аутентичный Picolisp или какой-нибудь ISO ISLISP например eisl.

и написать третий метапрог :))

уже на лиспе :)))

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

и горы фрактальными пейзажами, ога :)))

это пример к C привязкам из форта ATLAST, см. doc/classwar.pdf стр. 31/51 «Declaring external methods MOUNTAIN.CLS» – см. примеры *.cls

в doc/classwar.pdf про черепашку в стиле лого и его словарь форта стр. 28/21

форт объектно-ориентированный, разумеется.

вот например полигоны classes/poly.cls и doc/classwar.pdf стр. 7/51 «Preliminary tour»

вот жгутики и проводочки с пометкаме classes/lpoly.cls classes/lpoly1.cls

а вот целый шатл : classes/shuttle.cls

здесь в method draw мы видим отрисовку полилиниями примерно как в postscript, картинка на doc/classwar.pdf стр. 35/51

о! «SIERP. The Sierpinski gasket. Uses the turtle»

то есть, classes/sierp.cls можно использовать как пример словаря ОО форта с черепашкой типа как в Лого:



\   Sierpinski gasket class definition

\   See Abelson & diSessa, "Turtle Geometry" (MIT Press, 1986), pp. 87-88

PUBLIC:
    REAL size
    INTEGER levels

: gasket                              ( fsize levels -- )
    ?dup if
    dup 1 = if pendown else penup then  \ Avoid duplicate vectors
        3 0 do
            dup 2over 2.0 f/ rot 1- gasket
            forward
            120.0 right
        loop
        drop
    then
;

PRIVATE:

method draw
{
    size 2@ levels @ gasket 2drop
}

2variable dsize 2.0 dsize 2!
variable dlevels 3 dlevels !

method acquire
{
    distance "Size" dsize default arg
        0<> if false return then size 2!
    integer "Levels" dlevels default arg
        0<> if false return then levels !
    True
}

PUBLIC:

2variable two 2.0 two 2!

command method grow (( real "Growth factor" two default
                        ARG_nozero ARG_noneg or argmodes
                        "Smaller Bigger" keywords arg ))
{
    if
        "Smaller" strcmp 0= if 0.5 else 2.0 then
    then
        size 2@ f* size 2!
}

command method deeper
{
    1 levels +!
}

command method shallower
{
    levels @ 1 > if
        -1 levels +!
    then
}

это объектно-ориентированный форт где в gasket методе penup,pendown, forward, right – прямо напоминают словарь черепашки, ее «лексикон программирования».

вот тебе например, как надобно делать метапрог «на самом себе».

осталось откопать AutoCAD Release 11 досовский, под которым все это запустить :)))

или проще написать какую-то похожую на него запускалку, кроссплатформенную и на SDL :)

которая только этот кусок запускает, и пишет в лог.

ну или отрисовывает черепашку.

а не содержит все 100% функций полноценного автокада 11 версии :))

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

XLISP, от которого форкнулся AutoLISP похоже этот: rebcabin/xlisp

только там нужно понять как эту запускалку запустить.

то есть, чтобы запустить CLASSWAR нужен ATLAST,XLISP запускалка и какая-то среда типа acad.ads. (xload "class") запускает ClassWar, то есть это привязки XLISP/AutoLISP к объектно-ориентированному форту ClassWar поверх обычного форта ATLAST.

и там и там работает REPL, «REPL(CLASSWAR) в REPL(ALTAST) в REPL(XLISP/AUTOLISP) в REPL(ACAD)».

то есть, нужно сделать минималистичную запускалку для этой запускалки :))

пускай она не рисует прямо в досе, как acad release 11 или 12.

а хотя бы просто логи пишет. ну или например, через tcl/tk и рисовать пытается.

в общем, чтобы на этом написать 2.метапрог нужно сначала оживить метапроговую среду в досовом автокаде :))

или придумать простой shim вместо него.

1.метапрог на occam под KRoC тоже будет написать не сильно проще. сначала нужно найти все это всех древних версий.

потом прикрутить как-то noweb. потом переписать noweb на occam и прикрутить к нему через CFI tcl/tk и/или, SDL интерфейс :)))

и обойтись без noweb, переписав его на occam :)

3.метапрог - взять какой-то лисп c простым FFI и встраиваемостью, например Picolisp или EISL.

и прикрутить ООСУБД к библиотеке элементов жгутиков и проводочков на эдаком ОО лиспе с персистентными объектами.

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

что характерно, там есть какие-то объекты и привязки к tk в XLISP: xlisptk.lsp и tk.lsp

так что по ощущениям – простой встраиваемый лисп (или ближе к схеме). не CL.

но с объектами и какими-то небольшими батарейками.

оо система например, тоже макросами сделана: objects.lsp.

так что сделать небольшую запускалку, запускающую XLISP, из которого затем ATLAST и CLASSWAR по идее не сильно сложно.

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

православный TECO изначальный:

  • ?TecoEditor

  • скачать бесплатно без СМС: teco.1 или teco.2

  • анекдоты anhc-31-4-anec.pdf

  • вот что это они ничего не ценят и не понимают в емаксах! наглядные же макросы, еще и тщательно откомментированные: TECOC/src/win/clpars.tes

  • char oriented, а не line или screen oriented

Teco is character oriented. This means the unit of reference is a single character. On one hand, this may make teco cumbersome to use, but on the other hand, it gives teco very fine control over what is happening.

Teco does have a video mode, however text is still edited with commands on a character basis. The screen is simply updated once a command is completed to give the user a visual representation of where they are. Text is not edited in the screen view area.

Macros In general, vi, ed, and edlin are not programmable. This means you have the functions the editor provides and that is all you can do. However, teco is highly programmable. Programs that you write are called macros. In fact, the original version of Emacs was written as teco macros. Also, «emacs» actually means «Editing Macros».

еще у этого автора есть интересная ООП система на си в духе Objective C + SmallTalk: Dynace

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

Lisp-Stat поверх XLISP:

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

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

мне кажется, что если прочитать все мануалы teco и примеры, то это станет возможно – написать литературно-грамотное weave/tangle/фолдинг кодоблоков на божественном TECO.

и прикрутить ему няшный Motif-овский GUI на WINTERP как встраиваемый виджет типа емакса, ога.

только я столько не выпью. а жаль – изначальный Occam IDE по слухам был похож на литературно-грамотное IDE с фолдингом.

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

вот например *.tes исходники в TECOC/{lib,lib2,src{,win}} *.tes – вполне понятно откомментированы.

только в *.tec даже и не заглядывай – а то ioccc.org покажется тебе наглядной мурзилкою.

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

У GreenArrays еще 15 лет назад были интересные процессоры, которые нормально программировались только на Forth. Там много крошечных асинхронных ядер, 16 слов на стек.

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

Motif сейчас смотрится неплохо, тем что хотя бы стабильный. Но WINTERP и прочие библиотеки для него, далеки по удобству от того что было в метапроге на базе Nuklear. Immediate GUI позволяет за минимальное количество строк, строить как статические, так и просто очень динамические интерфейсы. После этого, смотреть на не-Immediate построение просто больно. В том же вебе это давно поняли, и теперь там Immediate-mode завернутый в реактивный шаблон. На телефонах новые фреймворки теперь так же строятся.

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

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

Если в лиспе написано (+ (f 5) (g 5)), то можно не знать, ничего про f и g, но понять структуру программы

Я б не сказал. Что такое (f 5) и (g 5)? Может быть что угодно, смотря что такое +.

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

Может быть что угодно, смотря что такое +.

+ определён в стандартной библиотеке, поэтому в любом случае: выполнить макрос-или-функцию f с параметром 5, выполнить макрос-или-функцию g с параметром 5, просуммировать результаты.

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

Это позволяет программисту читать программу на лиспе сверху вниз. Их часто и пишут так: сначала основной алгоритм, а ниже все функции, которые этот алгоритм вызывает. Форт читать можно только снизу вверх.

monk ★★★★★
()