LINUX.ORG.RU

Какой из лиспов лучше взять?

 ,


6

4

Собственно меня интересуют батарейки и возможность компиляции в нативный код (последнее в меньшей степени). Как я понял, серьезно следует рассматривать только различные реализации CL и Scheme (Racket).

Если вы предлагаете Clojure, хотелось бы услышать обоснование (кококо-интероперабельность-с-жабой и кококо-ынтырпрайз - не аргументы).

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

Получу подробную ошибку макроэкспанда на верхнем макросе, пройду по месту ошибки и сделаю эскспанд макроса на следующем уровне

Пиздец какой-то.

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

Ну ты же просил пример? Я тебе привел пример. А теперь вот внезапно оказывается, что я «доебался».

Зачем?

За забором, блять. Ты кудахчешь про то «ах, как же хуёво и сложно реализован loop в CL» и в то же время у тебя нет реализации на ракетке. Вот скажи теперь, что ты не питушара. Как же ты собрался мерить сложность реализации, долбоёб?

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

Пиздец какой-то.

Нет никакого пиздеца. Это делается элементарно за пару секунд подкоркой. Или у тебя есть предложения как это можно сделать ещё удобнее?

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

Как же ты собрался мерить сложность реализации, долбоёб?

Мне не нужна реализация, чтобы знать, какой она будет. бОльшая часть ракового лупа из CL - это банальный парсинг, которого в случае ракетки не будет, т.к. там можно просто описать грамматику.

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

Или у тебя есть предложения как это можно сделать ещё удобнее?

Сразу выделить некорректный терм и дать описание, чем он некорректен.

Нет никакого пиздеца. Это делается элементарно за пару секунд подкоркой.

Ну естественно у общеблядей это делается подкоркой. Приходится.

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

Мне не нужна реализация, чтобы знать, какой она будет.

Обычное кукареку неопытного щенка.

бОльшая часть ракового лупа из CL - это банальный парсинг, которого в случае ракетки не будет, т.к. там можно просто описать грамматику.

Покажешь?

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

Обычное кукареку неопытного щенка.

Я писал для разминки неполную реализацию (было лень определять все кляузы, т.к. тривиально и нудно), по-этому знаю, как она будет выглядеть.

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

Сразу выделить некорректный терм и дать описание, чем он некорректен.

Именно так и происходит — http://devio.us/~deadlock/slime-debugger-3.png. Делать экспанд на следующем шаге руками нужно только тогда, когда нужны все детали происходящего.

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

Так у тебя неправильный терм выделен, лол. Должно было выделить 0 и do-select внутри кавычек, а не вызов.

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

Ну и, бтв, описание проблемы тоже неточное. Это мы знаем что имеется ввиду конкретный 0 из формы макровызова, но откуда это знает кто-то, кто пользуется макросом из библиотеки? Такая ошибка может произойти в любой момент внутри какой-то внутренней ф-и.

anonymous
()

Лол, говноеды месяц спорят о сортах говна.

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

Мде... Я всё верно понимаю, что тебе нужна подобная шляпа:

(defmacro aif% (&whole whole test-form then-form &optional else-form &environment env)
  (if (variable-information 'it env)
      `(if ,@(rest whole))
      `(let ((it ,test-form))
         (if it ,then-form ,else-form))))

(aif% 1 it)     ; 1

(let ((it 666))
  (aif% 1 it))  ; 666

Это тема из того же ряда как и подброс в тело явно не заданных и нигде не описанных связываний на примере do-select. Т.е. наркоманская, никому не нужная и с тяжкими последствиями жесть. Экие анальные забавы схемачей да ракетчиков под веществами.

Спеши привести действительный и нужный use-case такого поведения, а не мычание подобное этому:

Нужно это, например, для того, чтобы вместе могли работать _несколько_ макросов, вводящих одну и ту же анафору.

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

После тебя.

А ты не опупел, наркоман? Во-первых, исходники loop-а можно почитать в любой открытой реализации CL, а также можно поглядеть на исходники адекватной альтернативы — iterate. А во-вторых, именно ты начал нудеть про loop и именно ты и должен привести proof своей кукаретики. Proof сорцами.

Сейчас же ты просто вяло кудахчешь:

Мне не нужна реализация, чтобы знать, какой она будет. бОльшая часть ракового лупа из CL - это банальный парсинг, которого в случае ракетки не будет, т.к. там можно просто описать грамматику.

Я писал для разминки неполную реализацию (было лень определять все кляузы, т.к. тривиально и нудно), по-этому знаю, как она будет выглядеть.

Ссылки-то на github будут?

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

Это тема из того же ряда как и подброс в тело явно не заданных и нигде не описанных связываний на примере do-select. Т.е. наркоманская, никому не нужная и с тяжкими последствиями жесть.

Ты ебанутый? Жесть это обычный аиф, с которым все макросы ломаются. А это нужно именно за тем, чтобы они, блять, работали.

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

Например, попытка вызвать макрос yoba внутри (let ((it ...)) (yoba ...)) у тебя не сработает - а должна.

Спеши привести действительный и нужный use-case такого поведения

Ну ты совсем тупой? Вон, даже анонимус уже все понял и старательно косит под дурачка. Проблема обычного aif в том, что нельзя писать макросы, которые раскрываются в aif. Потому что внутренности текут. Тот механизм, который в общелиспе - это как в ООП-язычке все члены всех классов объявлять публичными и не иметь возможности их скрыть, при этом функции стандартной библиотеки будут настырно в эти публичные члены лезть без твоей на то воли. То, о чем я говорю - это как раз та возможность тонкой настройки возможностей доступа к внутренностям конкретного модуля - мы можем из него it импортировать (тогда можно использовать макросы, раскрывающиеся в it «внутри» (yoba), использовать макросы с it (aif), писать свои макросы с it (yoba-anaphoric)), можно импортировать специальный ренейм-трансформер для параметра, тогда уже нельзя писать свои макросы с it (новые макросы будут использовать другую версию анафоры, которая не будет пересекаться), можно вообще не импортировать - тогда мы сможем только использовать макросы вида yoba, причем если у нас есть 10 модулей, каждый из которых вводит независимую анафору it и макрос типа yoba, то все их можно будет спокойно использовать одновременно, все just works и никогда не сломается. Особенности внутренней реализации эффективно скрыты.

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

А ты не опупел, наркоман?

Нет.

Во-первых, исходники loop-а можно почитать в любой открытой реализации CL

Но не ты их писал. Я считаю совершенно неприемлемой ситуацию, когда я код пишу, а ты сидишь и нихуя не делаешь.

Ссылки-то на github будут?

Кто выкладывает факториалы на гитхаб? Точнее, может кто и выкладывает, но я - нет.

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

Я считаю совершенно неприемлемой ситуацию, когда я код пишу, а ты ...

Пишешь, никому не показываешь. Но трындишь что твое никем не виданое в 10 раз круче. Балабол по определению.

antares0 ★★★★
()
Последнее исправление: antares0 (всего исправлений: 1)

Из современных лиспов стоит брать Clojure. Он наиболее практичный. Такие вещи как векторы, хэши в нём встроены, и синтаксис поприятнее будет чем в CL:

(def v [1 2 3 4])            ;; вектор
(def h {:a 1, :b 2, :c 3})   ;; хэш, запятые игнорируются

(v 3)  ;; третий элемент вектора
(:a h) ;; элемент для ключа :a

Синтаксис для лямбд тоже немного поприятнее чем в CL, например, удалить все элементы из вектора строк, где первый символ не \f (из книги Practical Common Lisp):

(remove-if-not #'(lambda (x) (char= (elt x 0) #\f))
  #("foo" "bar" "baz" "foom"))  ;; CL

(filter #(-> % (first) (= \f))
  ["foo" "bar" "baz" "foom"])   ;; Clojure

Тут еще и thread-first macro используется (http://clojuredocs.org/clojure_core/clojure.core/->).

Destructuring bind опять же поприятнее (и не надо явно писать destructuring-bind)

(def point {:x 5 :y 7})
(let [{:keys [x y]} point]
  (println "x:" x "y:" y))  ;; выводит x: 5 y: 7
alexeiz
()
Ответ на: комментарий от alexeiz

Из современных лиспов стоит брать Clojure. Он наиболее практичный.

+1. Практичные фичи, гораздо более читаемый код + интероп со всем ява-миром. Это вот как раз тот лишп, который возможно взлетит в современных условиях. На нем уже нормальные веб-фреймворки есть и прочая фигня.

ovk48 ★★★
()
Ответ на: комментарий от anonymous
(let((it ..))(yoba ..))

и не должна работать , потому что

 (let ((it 1))
   (boundp 'it))
 >> nil

Вон, даже анонимус уже все понял и старательно косит под дурачка.

Есть такое ;) Но нужного поведения то я добился ?

anonymous
()

Какой из лиспов лучше взять?

Для серьезной промышленной разработки — Common Lisp.

Остальное — хипстерские игрушки.

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

про настоящие преимущества clj ты не упомянул.

Ответ прост — их просто нет.

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

Для серьезной промышленной разработки — Common Lisp.

Мощно ты на ноль поделил.

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

Посмотрел я твой код ещё раз. У тебя для каждого it'a свой модуль.

(in-package :cl-user)
(defpackage :lala
  (:use :cl :anaphora)
  (:export #:yoba))
(in-package :lala)

(defmacro yoba (pred x)
  `(aif ,pred it ,x))

(in-package :cl-user)
(defpackage :tata
  (:use :cl :lala)
  (:export #:test))
(in-package :tata)



(defmacro yoba-anaphoric (value expr)
  `(let ((it ,value))
     ,expr))


(defun test (x)
  (yoba-anaphoric "ne-yoba" (yoba x it)))

CL-USER> (tata:test 1)
1
CL-USER> (tata:test nil)
"ne-yoba"
В одном пакете/модуле «магия» работать будет?

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

deadlock, ты что у нас на сосаче не сидишь? Ты же на нульчане раньше сидел.

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

и не должна работать , потому что

Ну в environment через макрос же можно узнать, что она связана?

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

У нас есть два модуля, в каждом свой it. понятно, что если мы импортируем оба it в один модуль - это будет identifier clash, ты просто не сможешь этого сделать:

#lang racket
(require racket/stxparam
         syntax/parse/define)


(module pizda racket
  (require racket/stxparam
           syntax/parse/define)
  (provide aif it)
  
  (define-syntax-parameter it #f)
  
  (define-simple-macro (aif pred then else)
    (let ([tmp pred])
      (syntax-parameterize ([it (make-rename-transformer #'tmp)])
        (if tmp then else)))))

(define-syntax-parameter it #f)
  
(define-simple-macro (yoba-anaphoric value expr)
  (let ([tmp value])
    (syntax-parameterize ([it (make-rename-transformer #'tmp)])
      expr)))

(require 'pizda)
->
lor-so12.rkt:25:0: module: imported identifier already defined at: it in: (#%require (quote pizda))
Надо сделать что-то вроде:
(require (rename-in 'pizda
                    [it pizda-it]))
         
(aif 'huy pizda-it 0)
->
huy
то есть смысл в чем, допустим у нас есть n модулей, в которых определены, соответственно, aif-1, aif-2, ..., aif-n, в каждом из которых свой it. теперь у нас для каждого aif-i есть модуль yoba-i, в котором определена своя yoba раскрывающаяся в aif из aif-i с it из aif-i. Теперь мы делаем модуль mega-yoba и в него импортируем все yoba-i - мы можем спокойно использовать все йобы и все будет ок. Если мы хотим использовать не только йобы но и, собственно, оригинал, то импортируем какой-нибудь aif-i - тоже все будет работать. Если нужен еще какой-то другой aif-i - импортируем и его, но делаем на it ренейм, теперь мы можем использовать в mega-yoba одновременно it и it-huy, на макросы это, офк, никак не влияет - в них все как работало так и продолжает работать.

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

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

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

какой возможности? нормальной проверки связываний? в ракетке практически все, что работает в module-level должно работать и в internal-definitions context. Если boundp так не будет работать т овсе нахуй сломается, вообще говоря, даже экспандер не будет работать, лол.

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

какой тут механизм конкретно? типа в yoba-anaphoric ридер подписывает tata:it, в yoba - lala:it? а в определении aif какой it?

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

не думай о механизме, думай как схемач, отключи мозг.

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

только вот лиспе нет ракетовского экспандера, лол.

Нету. По-этому в общелиспе половина макросов ломается, если их внутрь let'a пихнуть.

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

нет, не ломается.

кому ты врешь? всем очевидно, что ты лиспа в глаза не видел и даже хелловорлд не сможешь написать.

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

нет, не ломается.

Если евалить - то, да, наверное, будут работать. А если попытаться сперва скомпилировать файл - то тебя ждут уморительные приключения и костыли с eval-when, да и то не факт, что эти костыли помогут.

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

Отлично, ну покажи мне, как в общелиспе сделать

(begin-for-syntax
  (define-syntax-class huy
    (pattern x:pizda))
  
  (define-syntax-class pizda
    (pattern x:huy)))
если какой-то из классов убрать, то при экспанде должна быть ошибка, офк:
unsaved editor:6:13: pattern: not defined as syntax class at: pizda in: (pattern x:pizda)

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

Ну, естественно, я имею ввиду макросы, в которых не нужно делать восход солнца руками.

Ок-ок, в CL нельзя писать макросы «без ручного восхода солнца». Всё? Свободен!

Если ты уверен, что без «автоматического восхода солнца» писать программы невозможно - зачем ты заставляешь CL-еров решать твои проблемы?

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