LINUX.ORG.RU

Common lisp и императивщина


0

0

from http://www.en.wikipedia.org/wiki/Lisp_(programming_language) "..Scheme tends to favor the functional style, using tail recursion and continuations to express control flow. However, imperative style is still quite possible. <strong>The style preferred by many Common Lisp programmers may seem more familiar to programmers used to structured languages such as C..</strong>"

Что, действительно все так печально? зы: только начинаю смотреть на лисп и остро стоит вопрос scheme vs CL

★★★★★

>> Что, действительно все так печально?

А что тебя печалит, конкретно?

>> зы: только начинаю смотреть на лисп и остро стоит вопрос scheme vs CL

Ессно scheme и ессссно читать SICP.

cathode
()

Ась. Циклы в Scheme. Только рекурсивно. Её ж специально создавали вправлять мозги юным подованам. (Если что, то for какой нить на scheme определяется достаточно просто). В Common Lisp'e, т.к. tail recursion в стандарте не прописана, то есть всякие полезные макросы, вроде do и loop.

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

В схеме тоже есть do. И цикл пишется достаточно императивно.

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

>>А что тебя печалит, конкретно? Конкретно, напрягает вот это: "The style preferred by many Common Lisp programmers may seem more familiar to programmers used to structured languages such as C"

>>Ессно scheme и ессссно читать SICP. Почему ессно? CLOS не нужен? Макры у схемы есть?

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

Неужели функциональная парадигма - достойная альтернатива ООП? В голове не укладывается. Как, к примеру в функциональном стиле будут выглядеть объекты в игровом мире, которые с кучей свойств и методов?

makoven ★★★★★
() автор топика

Тут, имхо, ключевые слова "style preferred by many Common Lisp programmers" - стиль, предпочитаемый многими программерами. Но это же не значит, что все должны писать именно так. И на схеме, и на коммон лиспе можно при желании писать в императивном стиле, можно в функциональном. Хотя действительно, схема, имхо, больше располагает к функциональщине, чем CL.

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

Эти стили нужно совмещать а не противопоставлять. А выглядеть может так:

(define (game-object-new prop1 prop2) ..)
(define (game-object-get-prop obj) ..)
(define (game-object-set-prop! obj) ..)
(define (game-object-move obj dx dy) ..)

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

Лучше через замыкание сделать:
(define (new-object prop1)
(define (set-prop1! val)
(set! prop1 val))
(define (get-prop1)
prop1)
(define (dispatch m)
(cond ((eq? m 'get-prop1) get-prop1)
((eq? m 'set-prop1!) set-prop1!)
(else 'error)))
dispatch)

Немного громоздко, но таки объекты с внутренним состоянием.

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

С форматированием красивше:
(define (new-object prop1)
  (define (set-prop1! val)
    (set! prop1 val))
  (define (get-prop1)
    prop1)
  (define (dispatch m)
    (cond ((eq? m 'get-prop1) get-prop1)
          ((eq? m 'set-prop1!) set-prop1!)
          (else 'error)))
  dispatch)

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

> Неужели функциональная парадигма - достойная альтернатива ООП?

Что значит "альтернатива"? У них разные, слабо пересекающиеся области применимости. ООП весьма ограниченная модель, применимая в редких случаях. Функциональная декомпозиция более общая и мощная, но тоже не панацея.

> Как, к примеру в функциональном стиле будут выглядеть объекты в игровом мире, которые с кучей свойств и методов?

Ты уже заговорил о каких-то там "объектах", тем самым неизбежно приходя к ООП. Забудь об объектах, можно мир описывать и в совсем других терминах.

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

>Забудь об объектах, можно мир описывать и в совсем других терминах.

накидай ссылок на либы, анлоги qt хотя бы, мне просто интересно, как можно по другому сделать

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

Ну, если совсем по другому, то посмотри на Fudgets и почитай про functional reactive animation.

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

На счет функциональной не знаю. А вот в логическом программировании вполне можно описывать мир так как ты говоришь. Например

domains
date = date( integer, symbol, integer )
first_name, last_name = symbol
date_of_birth = date
person = person( first_name, last_name, date_of_birth )

predicates
set_first_name( person, first_name )
set_last_name( person, last_name )
set_date_of_birth( person, date_of_birth )

Наверно, можно как то еще. Я не очень хорошо разбираюсь.

Можно посмотреть на Visual Prolog, который начиная с 6 версии использует ООП модель.

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

Для схемы есть TinyCLOS

>Да, а можно использовать Common Lisp и CLOS, и все будет выглядеть еще лучше :)

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

Удачи тебе. =)

Вообще на Прологе "правильно" программировать сложно. Советую почитать Братко "Программирование на Prolog для систем искуственного интеллекта".

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

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

Если сам книги не найдешь, могу выложить.

Ian ★★
()

Отдельные реализации схемы уже сильно разрослись и задирают КЛ.

inb4 The cancer that is killing /S/cheme.

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

>накидай ссылок на либы, анлоги qt хотя бы, мне просто интересно, как можно по другому сделать

что именно сделать по-другому? вот тебе Frag, например: 3D-шутер на haskell (AFRP, Yampa) - никакого тебе традиционного ООП, а всех исходников на 69Kb (причём большая часть - BSP)

посмотри Type Classes, Type Families, посмотри что такое ADT (и GADT). и как с их помощью писать то, что ты привык писать на ООП-языках. всё, как бы, познаётся в сравнении

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

> Ты хочешь сказать, что это не ООП?

Там subtyping нет, и потому всё намного проще и гибче, чем в классическом ООП.

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

>Ты хочешь сказать, что это не ООП?

да

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

>Ъ, поэтому и интересно

вообще самый ад - это всё-таки фунциональные структуры данных Окасаки; а так мемоизированные санки, например, я и в C++ изобретал в своё время (SICP'а я тогда ещё не читал)

я сейчас занимаюсь reactive Элиотта, если есть желание попробовать фисто функциональное event-driven программирование - welcome ;) в качестве обучающего примера есть тетрис на GLUT'е

а вот если именно с LISP'ом, то это не ко мне. там скобок много :(

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

>> Кстати, безотносительно ООП, в Хаскеле нормальная раздельная компиляция есть?

> это есть что?

Это скомпилировать Хаскел-модуль в объектный файл (не обязательно ELF с машкодом), и потом импортировать его в другой модуль, не имея исходников первого?

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

>Это скомпилировать Хаскел-модуль в объектный файл (не обязательно ELF с машкодом), и потом импортировать его в другой модуль, не имея исходников первого?

не пробовал, думаю что без проблем. рекомендую спросить в haskell-cafe (или подождать Мигеля)

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

> Неужели функциональная парадигма - достойная альтернатива ООП?

В качестве proof of concept - Олег Киселёв в своё время сделал библиотеку, которая давала нехилые ООП-возможности в почти обычном Хаскеле (там использовалась парочка давно знакомых и всем привычных расширений). Так что - более чем достойная.

> Как, к примеру в функциональном стиле будут выглядеть объекты в игровом мире, которые с кучей свойств и методов?

Как записи, скорее всего.

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

> Это скомпилировать Хаскел-модуль в объектный файл (не обязательно ELF с машкодом), и потом импортировать его в другой модуль, не имея исходников первого?

Ты знаешь, у меня вот на машине нет исходников хаскелевых стандартных библиотек, типа Control.Monad или что-то в этом роде. Но всё работает.

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

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

MigMit:Test MigMit$ cat > Library.hs << EOF
> module Library where
> class GetInt a where getInt :: a -> Int
> instance GetInt Int where getInt x = x
> u = "Hi, people!"
> v :: Num a => a
> v = 1000000000000
> EOF
MigMit:Test MigMit$ ghc -c Library.hs 
MigMit:Test MigMit$ rm Library.hs
MigMit:Test MigMit$ cat > Main.hs << EOF
> module Main where
> import Library
> main =
>     do print $ getInt $ length "qwerty"
>        putStrLn u
>        print (v :: Integer)
>        print (v :: Int)
> EOF
MigMit:Test MigMit$ ghc -o program Main.hs Library.o
MigMit:Test MigMit$ ./program
6
Hi, people!
1000000000000
-727379968

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

> мне просто интересно, как можно по другому сделать

http://www.gtk-server.org/apps.html

http://www.gtk-server.org/tictactoe.clisp http://www.gtk-server.org/tictactoe.txt http://www.gtk-server.org/smart-calc.clisp

хотя примеры "дубовые": много boilerplate кода. По идее, это должен быть удобный DSL на макрах или просто функциях, чтобы отделить модель и представление.

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

> вот тебе Frag, например: 3D-шутер на haskell (AFRP, Yampa) - никакого тебе традиционного ООП, а всех исходников на 69Kb (причём большая часть - BSP)

там, и в районе raytracer.ml было построчное сравнение на разных языках, должно быть наглядно видно разницу в подходах

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