Напишу це тут, може, пан 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 вже є (або в стандартній бібліотеці, або ще десь). Як вони тут називаються?
Якщо функція з додатковими параметрами не викликається з-за меж її самої, я б оформив це як «іменований 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 vs. CL vs. Clojure ?..
Цитата: Python от ноября 2, 2011, 22:51
І коли вже тут нарешті розпочнеться генеральна битва Scheme vs. CL vs. Clojure ?..
Не скоро. Тим бiльше, що myst образився й пiшов, отож нема кому захищати CL.
Тоді тільки Scheme й Clojure лишаються. Але Clojure, без сумніву, переможе.
Цитата: 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:
Компактність транслятора в наші дні — річ другорядна, програми на дискетах вже ніхто не зберігає. Значення має можливість практичного застосування. Clojure тут виграє за ширшим набором засобів, навіть якщо не використовувати прямого доступу до ӂава-класів. У Scheme ж постійно доводиться майструвати велосипеди, тому програми виходять довшими.
Цитироватьбез обмежень на середовище
У мене склалось враження, що JVM за портабельністю явно випереджає будь-які кросплатформні мови програмування. Відмінності в реалізаціях типових трансляторів однієї мови на різних платформах стають відчутними у будь-якій більш-менш серйозній програмі.
Цитироватьможливiсть практичного застосування
До речi, а чим тут може похвалитися Clojure? Он, TinyScheme в GIMP'i використовують, наприклад. А Clojure?
Цитата: Python от ноября 3, 2011, 16:10
Цитироватьбез обмежень на середовище
У мене склалось враження, що JVM за портабельністю явно випереджає будь-які кросплатформні мови програмування. Відмінності в реалізаціях типових трансляторів однієї мови на різних платформах стають відчутними у будь-якій більш-менш серйозній програмі.
А як же embedded платформи?
Ну, це молода мова, і у неї ще все попереду. Хоча завдяки інтегрованості в JVM використовувати її можна як альтернативу чи доповнення до ӂави. Якщо ж говорити про відомі існуючі проекти на цій мові, Clojure використовується в одному з компонетів Twitter (http://my-clojure.blogspot.com/2011/10/clojure-killer-app.html).
ЦитироватьА як же embedded платформи?
Маю сумнів, що мови з динамічню типізацією є ідеальним рішенням для цих систем. А втім, дивлячись що мається на увазі під embedded, бо нині багато мобільних пристроїв мають вищі обчислювальні характеристики, ніж мій комп'ютер. На таких пристроях Java також здебільшого підтримується, і прикладний софт для них пишеться або на джаві, або на інших мовах для JVM.
Тобто ви вважаєте, що мені краще вивчати не Схему, а Клоӂуру?
Чому ні? Дивлячись які задачі ви ставите. Схема існує довше — а отже, існує й більше реалізацій для неї, у т.ч. й таких, що мають практичне застосування. У ряді проектів її використовують як мову скриптів. Клоӂура — нове явище, сфера її застосування ще не сформувалась толком, хоча мова виглядає досить перспективною. Для задач загального призначення Clojure видається зручнішим інструментом. Хоча вчити Lisp-подібні мови я все ж радив би починати зі Scheme (за умови, якщо відкинути такі її дивацтва, як define-syntax) — мова проста, ключові слова та синтаксис інтуїтивно зрозуміліші (хоча й менш лаконічні).