LINUX.ORG.RU

Lisp как платформа.


0

1

В продожение: http://www.linux.org.ru/view-message.jsp?msgid=2450305&page=1&nocache...

Часть ответов в ветке приведенной выше.

Вопрос в следующем:

- Чем вызвано утверждение о продуктивности Лиспа высказываемое его адептами (типа Грэхема) по сравнению со всеми другими? ( и вследствие: - Насколько адекватным является использование Lisp как платформы в современных условиях? - После perl, bash, Tcl, ECMAscript, C++, C какие концепции языка позволяющие повысить продуктивность оставаются в Лиспеб на которые стоит обратить внимание и которые могут повысить продуктивность? )

Мотивация к созданию ветки:

- Время изучения по личным ощущениям,кажется непопорционально долгим по сравнению с отдачей (сравнивалось c приведенными языками). - Усложнена компиляция, проблемы с переносимостью, упомянутые в первоначальной ветке. - Вакансии на Лисп существуют в мифах. - Для Web-programming существуют более развитые, документированые и переносимые вещи типа Perl, Ruby. - По результатм здесь: http://shootout.alioth.debian.org/ например, компактностью, мощностью, и потреблением памятью особенно Lisp не блещет. - Поиск личной мотивации к продолжению разборок с Лиспом, ввиду личного разочарования, отсутствия новых для себя концепций и не нахождения практической пользы. Создается впечатление что изучение его того не стоит, и полезнее углубляться в тот же perl, тем более ФП в нем присутствует, и без работы остаться сложнее.

Знаю что примеры успешных проектов на Лиспе есть, но их очень мало в потоке мэйнстрима.

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

(lisp или что нибудь дпугое)

Background: Что такое lisp closures и macroses знаю, SICP прочел. hyperspec пока не осилил и не вижу пока практической пользы.

В емаксе пишу простенькие функции редактирования.

anonymous

Ответ на: комментарий от Darkman

> http://lispjobs.wordpress.com/ - не наша страна. > Бррррр. И какой язык окромя Кобола, Великого и Ужасного, подходит под это определение ? Кобол это конечно да :) асболютно точно подходит конкретно под этот критерий. испытания временем не выдержал :( Ну и по другим не очень, хотя так интересный язык :)

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

> Из современны, AFAIK, это умеет MSVC.

А куда он её компилит ? Кроме того - этап линковки всё рано остаётся. В SBCL его нет.

> Вроде бы SBCL - это развитие CMUCL?

Это форк, на данный момент более продвинутый, но CMUCL тоже развивается.

> Ну а остальные неинтересны, ибо несвободные.

А нормальных свободных всего три: clisp, sbcl, cmucl. Остальные нормально стандарт не поддерживают и тормоза. Еще правда OpenMCL пытается трепыхаться.

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

> Видимо, он не понимает значения вышеупомянутых слов.

Ну просвяти меня, сирого, чего же я не понимаю.

>> Типизацию я могу в лиспопорогу добавить, при надобности. А из хаскеля выкидывается?

> bugmaker, скажи честно, сам-то не хихикал, когда это писал?

А по существу ?

PS. Тролль и есть. Или может по существу есть что сказать ?

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

>> Из современны, AFAIK, это умеет MSVC.

> А куда он её компилит ?

в объектный файл

> Кроме того - этап линковки всё рано остаётся.

Линковка тоже инкрементальная :)

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

>> Линковка тоже инкрементальная

>o_O

>Это как ? А как он екзешник собирает ?

ХЗ, никогда не писал инкрементальных линкеров :D Думаю, он просто правит обращения к измененному файлу, а сам файл содержит padding. Или IDE может постоянно держать линкуемый образ в памяти. Да мало ли что можно придумать... в старом Watcom C для OS/2 инкрементальная линковка была минимум в 2 раза быстрее полной.

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

> bugmaker, скажи честно, сам-то не хихикал, когда это писал?

Да я весь тред проржал :D Похоже, топикстартер изобрёл новый жанр, треш-троллинг.

bugmaker ★★★★☆
()

А вот кто подскажет, что лучше использовать для реального применения Haskell или Ocaml ? Плюсы и минусы обоих, исходя из опыта или теоритических соображений.

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

> Да мало ли что можно придумать... в старом Watcom C для OS/2 инкрементальная линковка была минимум в 2 раза быстрее полной.

При всех этих преимуществах интерактивное тестирование очень затруднено. Вот хочу я прогнать вызов с такими-то параметрами функции возвращающей хитрую структуру - либо пиши кучу printf либо welcome to debugger, вместо того чтобы вбить строку в REPL, сказать inspect, и увидеть результат.

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

То-то, я смотрю, у меня не получается с серьезным видом все это читать :)

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

> А вот кто подскажет, что лучше использовать для реального применения Haskell или Ocaml ? Плюсы и минусы обоих, исходя из опыта или теоритических соображений.

Если что-то особо быстрое надо, то ocaml. Иначе haskell

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

Недавно столкнулся с ситуацией, когда написаная под окамл 3.08 аппликуха не компилировалась под 3.10. Так что, если готов всё переписывать под каждую версию окамла, то привет :)

Вот ещё кстати чё есть http://www.podval.org/~sds/ocaml-sucks.html

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

> НУ может и так. Но тот же Ocaml даж с C/C++ хорошо держится. Этож не спроста.

Конечно, "это ЖЖ - неспроста". А с окамлом можно провернуть такую же штуку, которую с ПО на deep space 1 сделали?

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

>Где нету -- нигде. А есть -- в ghci, к примеру.

в упор не вижу как в этом ghci определить новую функцию или выполнить выражение с where или let

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

>в упор не вижу как в этом ghci определить новую функцию или выполнить выражение с where или let

Например так:

$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> let fib = 0:scanl (+) 1 fib
Prelude> take 20 fib
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181]
Prelude>

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

Для реального - питон или С.

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

> ой ну конешн. Глючит мне, что топикстартер *даже* про uncommon web просто не слышал. И куда ему со свиным рылом рассуждать, что существует для веб-программинг, а что нет?

Если вам не сложно, отпишитесь в http://www.linux.org.ru/view-message.jsp?msgid=2464281

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

> половина ObjectiveC нифига ни на что не похожа (вторая половина это чистый C), а также штатовское министерство обороны, ибо эти засранцы последний свой стратегический симулятор нарисовали на SmallTalk синтаксис у которого тот ещё.

Похожа, на SmallTalk как раз :P Нормальный у него синтаксис :))) Близок к разговорной речи. И Sexprы и объекты с сообщениями в СмоллТоке эквивалентны (просто первый элемент списка = объект а не функция, и слоты именованые). Правда, в том же ОбъектномС всё превращается в лес квадратных скобок :((

Для Макинтоша есть любопытный скриптовый язык на основе Лиспа со смоллтоковым синтаксисом: http://programming.nu/ . Чтобы набросать прототип на чём-то вместо Смоллтока ближе к родному API Cacao, оно вполне годится.

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

Помогите решить следующие задачи по Лиспу. Задачи по всей видимости простые, пожалуйста, кто может написать решение, будем признательны!

Задача№1 Список ( 3 5 7 ) имееет имя Р. Записать S-выражение, которое формирует новый список, который состоит из двух подсписков. В первом подсписке, должно содержаться сообщение (t или nil) о том, является ли произведение элементов заданного списка положительным, а во втором подсписке – сообщение, является ли это произведение четным.

Задача №2 Матрица представляется двухуровневым списком, последовательно расположенным слева направо, подсписки которого являются первой второй и так далее строками матрицы. Элементами матрицы могут быть произвольными (числами, списками). Допускаются различные длины строк. Исходную и результирующую матрицы, вывести на экран в виде матрицы. Задание: Преобразовать матрицу, удленив каждую ее нечетную строку на 2 элемента, дописыванием вконце строки первого, а затем второго элемента данной строки.

Задача №3 Составить функции separate и connect, которые осуществляют преобразование списков, являющихся их аргументами от формы представления ( a b c . . ) к форме ( . . . ( a ) b ) c) . . . ). Примечание: Для облегчения написания рекурсивной функции separate возможно использование либо дополнительного аргумента либо вспомогательной фукнции.

Задача №4 Образовать функцию exclusive (исключительный) с двумя аргуметами, каждый из которых является списком неповторяющихся в пределах данного списка элементов. Функция должна возвращать список элементов, невходящих в оба списка одновременно.

Задача №5 Используя приемы рекурсии в Лиспе, выполнить преобразования: получая в качестве исходного любой многоуровневый список вида ( a b ( c d e ( f ) g (h i ) j k ) l m n ) образовать результирующий список вида ( a b ( c d e ( f 3 ) g ( h i 3 ) j k 2 ) l m n 1 ), тоесть, в строке и в каждом подсписке, перед закрывающей скобкой следует дописать в дополнительной позиции значение уровня закрываемого списка или подсписка.

Пожалуста, если не тяжело, то решение можно выслать на адрес jamalrs@yandex.ru или jamalrs@mail.ru

Заранее спасибо, расчитываем на вашу помощь!

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

> Помогите решить следующие задачи по Лиспу.

Это неудачная шутка или вы думаете что тут есть желающие демпинговать в пользу двоечников? :-/

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

Чувак ты не в тему. Тут серьезные дядьки платформы обсуждают. С чего ты взял что кто-то тут может решать задачи :)

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

ONLY BLONDE GIRLS ARE PERMITTED TO USE THE CODE GIVEN BELOW.

I'm not sure I understand the task#3. Works only with Common Lisp. Needs some little effort to port to Scheme.

;;; tasks.lisp

#|
Задача №1 Список ( 3 5 7 ) имееет имя Р. Записать S-выражение, которое
формирует новый список, который состоит из двух подсписков. В первом
подсписке, должно содержаться сообщение (t или nil) о том, является ли
произведение элементов заданного списка положительным, а во втором
подсписке – сообщение, является ли это произведение четным.
|#

(defvar *P* (list 3 5 7))

(defun task1 (lst)
  (labels ((mul-list (lst)
	     (if (null lst)
		 1
		 (* (car lst) (mul-list (cdr lst))))))
    (list (>= (mul-list lst) 0) (evenp (mul-list lst)))))

#|
CL-USER> (task1 *P*)
(T NIL)
|#

#|
Задача №2 Матрица представляется двухуровневым списком,
последовательно расположенным слева направо, подсписки которого
являются первой второй и так далее строками матрицы. Элементами
матрицы могут быть произвольными (числами, списками). Допускаются
различные длины строк. Исходную и результирующую матрицы, вывести на
экран в виде матрицы. Задание: Преобразовать матрицу, удленив каждую
ее нечетную строку на 2 элемента, дописыванием вконце строки первого,
а затем второго элемента данной строки.
|#

(defvar *my-matrix*
  '((1 2 3 a b c)
    (3 4 a (1 3) 5 b c)
    (4 7 (2 5 a) c (z (a b)))))

(defun print-matrix (hdr mat)
  (format t "~A:~%" hdr)
  (dolist (line mat)
    (print line))
  (format t "~%~%"))

(defun task2 (mat)
  (if (null mat) (error "No matrix given"))
  (labels ((trans-matrix (mat tmat line-cnt)
	     (if (null mat)
		 (nreverse tmat)
		 (let ((line (car mat)))
		   (when (oddp line-cnt)
		     (let ((fst (first line)) (snd (second line)))
		       (setf line (nconc line (list fst snd)))))
		   (trans-matrix (cdr mat) (cons line tmat) (1+ line-cnt))))))
    (print-matrix "Initial matrix" mat)
    (print-matrix "Result matrix" (trans-matrix mat nil 1))))

#|
CL-USER> (task2 *my-matrix*)
Initial matrix:

(1 2 3 A B C) 
(3 4 A (1 3) 5 B C) 
(4 7 (2 5 A) C (Z (A B))) 

Result matrix:

(1 2 3 A B C 1 2) 
(3 4 A (1 3) 5 B C) 
(4 7 (2 5 A) C (Z (A B)) 4 7) 

NIL
|#

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

#| Задача №3 Составить функции separate и connect, которые осуществляют преобразование списков, являющихся их аргументами от формы представления ( a b c . . ) к форме ( . . . ( a ) b ) c) . . . ). Примечание: Для облегчения написания рекурсивной функции separate возможно использование либо дополнительного аргумента либо вспомогательной фукнции. |#

(defvar *my-list* '(a b c d e f g))

(defun separate (lst) (labels ((rec (lst acc) (if (null lst) acc (rec (cdr lst) (if (null acc) (list (car lst)) (list acc (car lst))))))) (rec lst nil)))

(defun connect (lst) (labels ((rec (lst acc) (cond ((null lst) acc) ((atom lst) (cons lst acc)) (t (rec (car lst) (rec (cdr lst) acc)))))) (rec lst nil)))

#| CL-USER> (separate *my-list*) (((((((A) B) C) D) E) F) G) CL-USER> (connect (separate *my-list*)) (A B C D E F G) |#

#| Задача №4 Образовать функцию exclusive (исключительный) с двумя аргуметами, каждый из которых является списком неповторяющихся в пределах данного списка элементов. Функция должна возвращать список элементов, невходящих в оба списка одновременно. |#

(defvar *list1* '(a 2 b 4 c 7 d 6 e f)) (defvar *list2* '(b c 4 8 k 2 5 d w s))

(defun exclusive (lst1 lst2) (labels ((rec (lst1 lst2 acc) (cond ((null lst1) acc) ((member (car lst1) lst2) (rec (cdr lst1) lst2 acc)) (t (rec (cdr lst1) lst2 (cons (car lst1) acc)))))) (nconc (rec lst1 lst2 nil) (rec lst2 lst1 nil))))

#| CL-USER> (exclusive *list1* *list2*) (F E 6 7 A S W 5 K 8) |#

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

Damn it!

#|
Задача №3 Составить функции separate и connect, которые осуществляют
преобразование списков, являющихся их аргументами от формы
представления ( a b c . . ) к форме ( . . . ( a ) b ) c) . . . ).
Примечание: Для облегчения написания рекурсивной функции
separate возможно использование либо дополнительного аргумента либо
вспомогательной фукнции.
|#

(defvar *my-list* '(a b c d e f g))

(defun separate (lst)
  (labels ((rec (lst acc)
	     (if (null lst)
		 acc
		 (rec (cdr lst)
		      (if (null acc)
			  (list (car lst))
			  (list acc (car lst)))))))
    (rec lst nil)))

(defun connect (lst)
  (labels ((rec (lst acc)
             (cond ((null lst) acc)
                   ((atom lst) (cons lst acc))
                   (t (rec (car lst) (rec (cdr lst) acc))))))
    (rec lst nil)))

#|
CL-USER> (separate *my-list*)
(((((((A) B) C) D) E) F) G)
CL-USER> (connect (separate *my-list*))
(A B C D E F G)
|#

#|
Задача №4 Образовать функцию exclusive (исключительный) с двумя
аргуметами, каждый из которых является списком неповторяющихся в
пределах данного списка элементов. Функция должна возвращать список
элементов, невходящих в оба списка одновременно.
|#

(defvar *list1* '(a 2 b 4 c 7 d 6 e f))
(defvar *list2* '(b c 4 8 k 2 5 d w s))

(defun exclusive (lst1 lst2)
  (labels ((rec (lst1 lst2 acc)
	  (cond ((null lst1) acc)
		((member (car lst1) lst2)
		 (rec (cdr lst1) lst2 acc))
		(t (rec (cdr lst1) lst2 (cons (car lst1) acc))))))
    (nconc (rec lst1 lst2 nil)
	   (rec lst2 lst1 nil))))

#|
CL-USER> (exclusive *list1* *list2*)
(F E 6 7 A S W 5 K 8)
|#

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

#|
Задача №5 Используя приемы рекурсии в Лиспе, выполнить преобразования:
получая в качестве исходного любой многоуровневый список вида ( a b (
c d e ( f ) g (h i ) j k ) l m n ) образовать результирующий список
вида ( a b ( c d e ( f 3 ) g ( h i 3 ) j k 2 ) l m n 1 ), тоесть, в
строке и в каждом подсписке, перед закрывающей скобкой следует
дописать в дополнительной позиции значение уровня закрываемого списка
или подсписка.
|#

(defvar *new-list* '(a b (c d e (f) g (h i) j k) l m n))

(defun numerate-sublist (tree)
  (labels ((rec (tree acc cnt)
             (cond ((null tree) (nreverse acc))
                   ((consp (car tree))
                    (rec (cdr tree)
                         (cons (rec (car tree) nil (1+ cnt)) acc) cnt))
                   (t (rec (cdr tree)
			   (if (cdr tree)
			       (cons (car tree) acc)
			       (nconc (list cnt) (cons (car tree) acc)))
			   cnt)))))
    (rec tree nil 1)))

#|
CL-USER> (numerate-sublist *new-list*)
(A B (C D E (F 3) G (H I 3) J K 2) L M N 1)
|#
 

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

FAQ. Как получить код на шару.

1. Запостить на ЛОР тему об ущербности/превосходстве нужной платформы (Х) над остальными.

2. Поддержать рассуждения в стиле - Х отстой и не подходить для решения задач типа Y.

3. Когда дискуссия достигнет разгара вкинуть задачу с темой "А вам слабо?", "На Z я сделал это за 10 минут", "Постиг дао платформы Х, но не могу решить задачу", и т.п.

4. Отфильтровать результаты

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

he-he... on forum.ixbt.com they usually ask for $$ and make fun of the topic author before they actually write any code. And still they do not do exactly what is asked from them, like if the author asks for code in C language, smbd write it in Haskell. And you've given that code for nothing, you just did it on demand for free.

Does that mean Lisp coders work for food or even for free?

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

Look everybody! Lisper solved few simple tasks just for fun, and that is, my red-eyed friends, a vivid acknowledgement of a well known fact that Lispers code just for fun, but when they are back for their daily work, they continue using C++ or Java or any other _adequate_ language.

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

You are right my dear buddy. You are so damn right.

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

Lol так и было в стародавней теме :)

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

>Компенсирует более человекоподобный синтаксис который у них есть. Я понимаю что для тебя - это не важно, если для тебя Лисп это вершина эволюции, внизу которой брэйнфак. Для меня важно.

Синтаксис можно сделать любой в отличии от семантики. S-выражения дополняются встраиваемым синтаксисом в зависимости от задачи.

>Да именно так, стало. Очень удобное поделие. >Быдлоподелие 50-х Лисп хитом сезона не стало. наверное потому что >действительно нормальных мало. И все эти нормальные - лисперы, >которые не принимают участие в разработке востребованых языков.

Тебе надо срочно посмотреть хит сезона "Самый лучший фильм" и проблеваться как следует.

>Кстати, то чего тебе не хватало в Питоне может быть легко имплементировано в язык.

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

>Еще я не знаю кабалу, и не буду тратить на нее месяцы пока мне не объяснят: "только на фига?" (цитируя тебя)

Да делай что хочешь, не приставай к Лиспу ;-) Почему именно из-за денег сейчас надо спешно изучать Лисп, я тебе не скажу.

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

- Python ? - OK. - Yes! - Stupid Google engineering VP...he he he

(c) Microsoft engineering VP

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

" - Python ?
- OK.
- Yes!
- Stupid Google engineering VP...he he he"

(c) Microsoft engineering VP

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

1) Знаю, лень. Возьму готовый ласапед. 2) Смотрел. 3) В грузчики - с радостью за конкурентную зарплату и достаток свободного времени. предлагайте ЗП. 4) "Не приставай :)" Сделали жену из средства программерского. ну это ладно еще, многие ему поклоняются.

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

Да еще, я его знаю. и решаю на нем задачи, спасибо. Только я ему не поклонюсь как дебил, невелика цаца, сделает что сказано и без этого. А будет долго/хреново делать - будет заменена.

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

> Например, меня, после C, Ada и Lisp, на другие языки палкой не загонишь.

Дзен-гуру, однако.

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

Перечитал твои посты. Да чувак, умеешь разжечь.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.