swizard (swizard) wrote,
swizard
swizard

Category:

parenscript fix?

Все-таки следует признать, что один жирный минус в CL существует: практически нет библиотек приемлемого качества. Не, с количеством проблем никаких, но большинство пакаджей тупо уровня контрольной работы школоты, или вообще в формате "proof of concept".

Такое ощущение, что авторы даже и не пытаются проверить работоспособность своего добра в реальных условиях.

Например, в cl-prevalence от меня уже ушло два патча и еще один надо не забыть засабмитить. Патчи блин уровня "без них вообще никак не работало".

Хорошо, теперь вот два часа тупил, что так все тормозит в weblocks на do-dialog. В итоге, дебаг паяльником вывел на parenscript::parenscript-print -- я в него втыкал расширенными от ужаса глазами минут десять, пытаясь сообразить, что имелось в виду. Чуть-чуть поправил, стало работать в девяносто тысяч раз быстрее:

(defmethod parenscript-print (form)
  (let ((*indent-level* 0)
        (*print-accumulator* ()))
    (if (and (listp form) (eql 'js-block (car form))) ; ignore top-level block
        (loop for (statement . remaining) on (third form) do
             (ps-print statement) (psw ";") (when remaining (psw #\Newline)))
        (ps-print form))
    
;;; wtf?!
;;     (reduce (lambda (acc next-token)
;;               (if (and (stringp next-token)
;;                        (stringp (car (last acc))))
;;                   (append (butlast acc) (list (concatenate 'string (car (last acc)) next-token)))
;;                   (append acc (list next-token))))
;;             (cons () (reverse *print-accumulator*)))))
    
    (list (with-output-to-string (out)
            (loop
               :for next-token :in (reverse *print-accumulator*)
               :do (write-string next-token out))))))


Не очень уверен, что код получился эквивалентный (надо еще поисследовать, прежде чем сабмитить патч), но на глаз ничего не сломалось.

Не, ну что за индусятина в серьезном коде, а? :)
(append (butlast acc) (list (concatenate 'string (car (last acc)) next-token)))

-- это ж блядь посимвольно для строк, неудивительно, что 20-ти килобайтный виджет компилируется 9 секунд.

Оно, конечно, понятно, что parenscript, в основном, на compile-time расчитан. Но все равно это не отмазка для таких катастрофических тормозов.
Tags: cl-prevalence, code, common lisp, library, lisp, parenscript, poor quality
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 34 comments