Лингвофорум

Local boards - Разделы на разных языках => Український форум => Загальне спілкування => Тема начата: Demetrius от октября 28, 2011, 14:31

Название: Питання з Scheme
Отправлено: Demetrius от октября 28, 2011, 14:31
Напишу це тут, може, пан Python чи ще хтось мені щось порадить. :-[

Я ось почав вивчати Scheme. Ну, вона ніби проста, але все одно вивчати є що.

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

#!/usr/bin/guile -s
!#

(define (implode-with-head parts head delim)
  (if (eqv? parts '())
      head
      (implode-with-head (cdr parts)
                         (string-append head delim (car parts))
                         delim)))

(define (implode parts delim)
  (if (eqv? parts '())
      ""
      (implode-with-head (cdr parts) (car parts) delim)))

(display (implode '("Hello" "world" "," "my" "name" "is" "Dmitry") ";"))
(newline)

; vim:filetype=scheme


Сам розумію, що некрасиво. Як це реалізувати ідіоматично?




І ще питання. Напевне ж такі функції, як split та join у Python'і та implode і explode в PHP вже є (або в стандартній бібліотеці, або ще десь). Як вони тут називаються?
Название: Питання з Scheme
Отправлено: Python от октября 28, 2011, 16:28
Якщо функція з додатковими параметрами не викликається з-за меж її самої, я б оформив це як «іменований let». (http://www.scheme.com/tspl3/control.html#./control:s18)

(define (implode parts delim)
  (if (eqv? parts '())
      ""
      (let loop ((parts (cdr parts)) (head (car parts)))
         (if (eqv? parts '())
            head
           (loop (cdr parts)
                 (string-append head delim (car parts)))))))
Название: Питання з Scheme
Отправлено: Python от ноября 2, 2011, 22:51
Offtop

І коли вже тут нарешті розпочнеться генеральна битва Scheme vs. CL vs. Clojure ?..
Название: Питання з Scheme
Отправлено: Demetrius от ноября 2, 2011, 23:07
Цитата: Python от ноября  2, 2011, 22:51
І коли вже тут нарешті розпочнеться генеральна битва Scheme vs. CL vs. Clojure ?..
Не скоро. Тим бiльше, що myst образився й пiшов, отож нема кому захищати CL.
Название: Питання з Scheme
Отправлено: Python от ноября 2, 2011, 23:19
Тоді тільки Scheme й Clojure лишаються. Але Clojure, без сумніву, переможе.
Название: Питання з Scheme
Отправлено: Demetrius от ноября 3, 2011, 06:36
Цитата: Python от ноября  2, 2011, 23:19
Тоді тільки Scheme й Clojure лишаються. Але Clojure, без сумніву, переможе.
А їм обов'язково влаштовувати битву? Менi здавалося, що вони дещо в рiзних категорiях:  Scheme—загальна iдея, багато реалiзацiй, без обмежень на середовище, Clojure—саме конкретна реалiзацiя на основi Java, cxu ne? Може, логiчнiше було б казати про битву Clojure та певних реалiзацiй Scheme?


Так й взагалi, що значить «переможе»? Переможе за якими критерiями? По компактностi Clojure явно не обiйде TinyScheme. :eat:
Название: Питання з Scheme
Отправлено: Python от ноября 3, 2011, 16:01
Компактність транслятора в наші дні — річ другорядна, програми на дискетах вже ніхто не зберігає. Значення має можливість практичного застосування. Clojure тут виграє за ширшим набором засобів, навіть якщо не використовувати прямого доступу до ӂава-класів. У Scheme ж постійно доводиться майструвати велосипеди, тому програми виходять довшими.
Название: Питання з Scheme
Отправлено: Python от ноября 3, 2011, 16:10
Цитироватьбез обмежень на середовище
У мене склалось враження, що JVM за портабельністю явно випереджає будь-які кросплатформні мови програмування. Відмінності в реалізаціях типових трансляторів однієї мови на різних платформах стають відчутними у будь-якій більш-менш серйозній програмі.
Название: Питання з Scheme
Отправлено: Demetrius от ноября 3, 2011, 16:26
Цитироватьможливiсть практичного застосування
До речi, а чим тут може похвалитися Clojure? Он, TinyScheme в GIMP'i використовують, наприклад. А Clojure?

Цитата: Python от ноября  3, 2011, 16:10
Цитироватьбез обмежень на середовище
У мене склалось враження, що JVM за портабельністю явно випереджає будь-які кросплатформні мови програмування. Відмінності в реалізаціях типових трансляторів однієї мови на різних платформах стають відчутними у будь-якій більш-менш серйозній програмі.
А як же embedded платформи?
Название: Питання з Scheme
Отправлено: Python от ноября 3, 2011, 17:01
Ну, це молода мова, і у неї ще все попереду. Хоча завдяки інтегрованості в JVM використовувати її можна як альтернативу чи доповнення до ӂави. Якщо ж говорити про відомі існуючі проекти на цій мові, Clojure використовується в одному з компонетів Twitter (http://my-clojure.blogspot.com/2011/10/clojure-killer-app.html).
Название: Питання з Scheme
Отправлено: Python от ноября 3, 2011, 17:19
ЦитироватьА як же embedded платформи?
Маю сумнів, що мови з динамічню типізацією є ідеальним рішенням для цих систем. А втім, дивлячись що мається на увазі під embedded, бо нині багато мобільних пристроїв мають вищі обчислювальні характеристики, ніж мій комп'ютер. На таких пристроях Java також здебільшого підтримується, і прикладний софт для них пишеться або на джаві, або на інших мовах для JVM.
Название: Питання з Scheme
Отправлено: Demetrius от ноября 3, 2011, 17:28
Тобто ви вважаєте, що мені краще вивчати не Схему, а Клоӂуру?
Название: Питання з Scheme
Отправлено: Python от ноября 3, 2011, 17:53
Чому ні? Дивлячись які задачі ви ставите. Схема існує довше — а отже, існує й більше реалізацій для неї, у т.ч. й таких, що мають практичне застосування. У ряді проектів її використовують як мову скриптів. Клоӂура — нове явище, сфера її застосування ще не сформувалась толком, хоча мова виглядає досить перспективною. Для задач загального призначення Clojure видається зручнішим інструментом. Хоча вчити Lisp-подібні мови я все ж радив би починати зі Scheme (за умови, якщо відкинути такі її дивацтва, як define-syntax) — мова проста, ключові слова та синтаксис інтуїтивно зрозуміліші (хоча й менш лаконічні).