Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Уроки LISP (українською мовою)

Автор Python, февраля 10, 2012, 21:45

0 Пользователи и 1 гость просматривают эту тему.

Python

ЦитироватьЩо можна поміняти, щоб зробити цю програму більш лісповою?
Замість define краще використовувати let (особливо для змінних всередині функцій).
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2


Demetrius

Цитата: Python от апреля 19, 2012, 13:56
ЦитироватьЩо можна поміняти, щоб зробити цю програму більш лісповою?
Замість define краще використовувати let (особливо для змінних всередині функцій).
Чому? let добавляє зайву скобку в кінці, а їх і так там багато. :-[

Тай ніби то define усередені функцій працує локально, отож чому його треба позбігати?

Python

ЦитироватьА почему бы не перевести эти уроки в этот раздел: http://lingvoforum.net/index.php/board,157.0.html
Мені, маючи модераторські повноваження в цьому розділі, зручніше вести їх тут. Крім того, мови програмування серед уроків людських мов виглядають трохи дивно :)
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Python

Цитата: Demetrius от апреля 19, 2012, 15:28
Цитата: Python от апреля 19, 2012, 13:56
ЦитироватьЩо можна поміняти, щоб зробити цю програму більш лісповою?
Замість define краще використовувати let (особливо для змінних всередині функцій).
Чому? let добавляє зайву скобку в кінці, а їх і так там багато. :-[

Тай ніби то define усередені функцій працує локально, отож чому його треба позбігати?
Можна й так, в принципі. Але питання стосувалось лісп-вейності, а внутрішнє define є суто схемівським прийомом — у Clojure, наприклад, внутрішнє def чи defn працює як глобальне.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Demetrius

Цитата: Python от апреля 19, 2012, 15:42Можна й так, в принципі. Але питання стосувалось лісп-вейності, а внутрішнє define є суто схемівським прийомом — у Clojure, наприклад, внутрішнє def чи defn працює як глобальне.
Зрозуміло. А я вже подумав, що причина в тому, що let можна скопіпастити куди завгодно, а define можепогризтися з іншими ідентифікаторами...

Demetrius

Offtop
До речі, я зрозумів, у чому справжня перевага let'ів над локальними define'ами: змінні, створені за допомогою define, можна set!. А let'и не можна, отож компілятори краще оптимізують та менше шансів щось наплутати.

Попробував собі написати Клоџурне doto для Kaw'и. Я все правильно роблю?

; Clojure-like doto macro for Kawa scheme
(define-syntax doto
  (syntax-rules ()
    ((_ object (method . args))
       (let ((obj object))
            (method obj . args)
       obj))
    ((_ object method1 method2 ...)
         (begin (doto object method1)
           (doto object method2 ...)))))


Викликається так:
(*:show (doto
  (javax.swing.JFrame)
  (*:set-title "Hello world!")
  (*:set-size 300 50)))


Виклик *:show не можна поставити останнім аргументом у doto, адже тоді doto поверне JFrame, Kawa попробує вивести його у REPL і все зависне.

Python

ЦитироватьДо речі, я зрозумів, у чому справжня перевага let'ів над локальними define'ами: змінні, створені за допомогою define, можна set!. А let'и не можна, отож компілятори краще оптимізують та менше шансів щось наплутати.
Технічно, з let-змінними set! теж працює (принаймні, в SISC і KAWA). Хоча для Clojure це справді так — let створює незмінювану локальну змінну, тоді як def може працювати як  define й set!, перевизначаючи глобальну змінну.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Python

ЦитироватьПопробував собі написати Клоџурне doto для Kaw'и. Я все правильно роблю?
Схоже, що не все. Судячи з усього, воно розписує згаданий приклад у щось назразок
(*:show
(begin
  (let ((obj (javax.swing.JFrame)))
    (*:set-title obj "Hello world!"))
  (let ((obj (javax.swing.JFrame)))
    (*:set-size obj 300 50))))
Таким чином, генеруються два фрейми, з яких відображається лише останній (з заданим розміром, але без заданого заголовку). З цієї ж причини виникає проблема з show, якщо його розмістити в doto.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Demetrius

Цитата: Python от апреля 23, 2012, 13:30
Схоже, що не все. Судячи з усього, воно розписує згаданий приклад у щось назразок
...
Таким чином, генеруються два фрейми, з яких відображається лише останній (з заданим розміром, але без заданого заголовку).
Гм... А так:
; Clojure-like doto macro for Kawa scheme
(define-syntax doto
  (syntax-rules ()
    ((_ object (method . args))
       (let ((obj object))
            (method obj . args)
       obj))
    ((_ object method1 method2 ...)
         (let ((obj object))
              (doto obj method1)
              (doto obj method2 ...)))))

Ніби то так воно працює правильно. Так добре?

Цитата: Python от апреля 23, 2012, 13:30З цієї ж причини виникає проблема з show, якщо його розмістити в doto.
Ні, проблема з *:show викликана недоробленим графічним інтерфейсом Kaw'и. ;D

Demetrius

Цитата: Python от апреля 23, 2012, 13:21
Технічно, з let-змінними set! теж працює (принаймні, в SISC і KAWA).
Гм... Тоді навіщо в схемі let взагалі? :what:

Python

Можливо. Я користуюсь стандартною консоллю замість кавівського GUI, і нічого схожого на зависання не помітив.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Python

Цитата: Demetrius от апреля 23, 2012, 13:56
Цитата: Python от апреля 23, 2012, 13:21
Технічно, з let-змінними set! теж працює (принаймні, в SISC і KAWA).
Гм... Тоді навіщо в схемі let взагалі? :what:
begin і let по-різному взаємодіють з define всередині.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Demetrius

Цитата: Python от апреля 23, 2012, 14:00
Можливо. Я користуюсь стандартною консоллю замість кавівського GUI, і нічого схожого на зависання не помітив.
Зависання пов'язане саме з графічним інтерфейсом. Коли написати (javax.swing.JButton text: "Push me!"), в графічному інтерфейсі появляється не опис об'єкта, а кнопка. Але з вікнами у цієї можливості проблема: якщо написати (javax.swing.JFrame title: "I am a bug"), усе зависне.

Python

ЦитироватьЗависання пов'язане саме з графічним інтерфейсом. Коли написати (javax.swing.JButton text: "Push me!"), в графічному інтерфейсі появляється не опис об'єкта, а кнопка. Але з вікнами у цієї можливості проблема: якщо написати (javax.swing.JFrame title: "I am a bug"), усе зависне.
Тоді зрозуміло. Гадаю, цю проблему можна обійти, обгорнувши все в begin з якимсь пустим виразом після дії з фреймом.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Demetrius

Цитата: Python от апреля 23, 2012, 14:07
Тоді зрозуміло. Гадаю, цю проблему можна обійти, обгорнувши все в begin з якимсь пустим виразом після дії з фреймом.
Ну, винесення (*:show ...) — це якраз спосіб обійти цю проблему. ;D

Demetrius


Python

Цитата: Demetrius от апреля 23, 2012, 14:11
До речі, мій макрос гігієнічний? :what:
На жаль, із цим «гігієнічним» ситаксисом важко зрозуміти, що він насправді робить гігієнічно, а що ні. З defmacro в поєднанні з gensym можна, принаймні, побачити неозброєним оком, що там відбувається насправді.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Python

Провів невеликий тест. Ніби гігієнічний.
#|kawa:22|# (define obj 5)
#|kawa:24|# (doto 6 (display) (begin (display obj)))
6 5 6
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2


Demetrius

Я вже собі наступну вправу придумав: думаю написати макрос, який імітує клоџурний import. Але, думаю, тут syntax-rules не підійде.

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр