LINUX.ORG.RU

Избранные сообщения alienclaster

[CL] [Пакеты] Переопределение функции

Форум — Development

Привет. Столкнулся с проблемой переопределения функции из наследованного пакета. Мне нужно в своем пакете переопределить функцию своей, которая использует эту функцию. Пример:

(defpackage :x1
 (:use :cl)
 (:export :foo))

(in-package :x1)

(defun foo ()
 (format t "42~%"))


(defpackage :x2
 (:use :cl :x1)
 (:shadowing-import-from :x1 :foo))

(in-package :x2)

(defun foo ()
 (x1::foo)) <- stack overflow

(foo)

Получается бесконечная рекурсия. Если бы x1 не импортировал foo, проблемы не возникло, но как победить эту ситуацию?

 

staseg
()

Есть ли в ФП черный ящик?

Форум — Development

Как известно, одной из фундаментальных концепций программирования и проектирования является абстракция черного ящика. Это означает, что нас не интересует, как устроен черный ящик изнутри, мы только знаем, как он работает.

Допустим, у нас есть функция, внутри которой содержится цикл. Если она даже ничего не меняет вовне, с точки зрения ФП такая реализация недопустима. А это значит, что вместо абстрагирования от внутреннего устройства, мы на нем наоборот фокусируемся. Отсюда можно сделать вывод, что в функциональном программировании определенно есть проблемы с барьерами абстракции. Что вы думаете по этому поводу, господа?

 

fuckYankee
()

Джентельменский набор ЯП

Форум — Development

Вобщем задумываю поучить какой-нибудь язык программирования. Вроде бы понимаю что пишут на С++, сам, конечно же, ничего сложнее хэловорлда не делал, но его-то мне учить придется по программе в универе. Сейчас присматриваюсь к питону...

А вообще какие языки и в какой последовательности было бы неплохо поучить?

Rapt0r
()

лямбды в новых язычках - PR или реальные полезняшки?

Форум — Talks

Народ, а поясните пожалуйста, что конкретно имеется ввиду, когда некто, описывая всякие плюшки новорожденного языка восторженно заявляет «там есть лямбды!».

Ну что есть lambda в каком-нибудь lisp я представляю и даже понимаю зачем оно и как им пользоваться. В lisp'е. А что имеется ввиду под «лямбдой» например, в C#?

Хотелось бы увидеть не только цитаты из википедии, а простенькие примеры того, как эта лямбда сильно упрощает жизнь, удобство даёт и всё такое. В виде примера кода, разумеется, с пояснениями почему тут именно лямбда крута и без неё некузяво.

Только чтобы это не было аналогом перлового однострочника типа

perl -e 'print sub{ $_[0] + $_[1]; }->(1,2)."\n";'
ибо в этом никаких новшеств и преимуществ нету.

Просто сдаётся мне что «лямбда» в нынешних сишарпах это пиарное название допотопных безымянных функций которые даже в перле есть и никаких новшеств в этом на самом деле нету.

 , ,

Stanson
()

Allegro CL 9.0 Free Express Edition стал доступен для загрузки

Новости — Проприетарное ПО
Группа Проприетарное ПО

Для загрузки на попробовать стала доступна версия коммерческой реализации языка программирования Common Lisp — Allegro CL 9.0 Express Edition.

Доступны пакеты для:

  • Linux (glibc 2.11 или позже);
  • Mac OS X (10.6 или позже), включает поддержку Lion;
  • FreeBSD (8.2 или позже);
  • Windows (XP, Vista, 7, 8, Server).

Основные новшества и изменения в этой версии:

  • полная поддержка SMP;
  • 820 исправлений и улучшений с последнего релиза;
  • полностью обновлен AllegroServe — вебсервер Franz Inc., написанный на лиспе: автоматическая компрессия/декомпрессия файлов, поддержка chunking, новый выбор опций безопасности, включая TLS v1.0 (также известный как SSL v3.1) протокол для защищенных соединений;
  • улучшена интеграция с Java через модуль jLinker, улучшен протокол, стал проще API;
  • новая и значительно упрощенная инсталляция для графических утилит на Mac 64-бит.

>>> Загрузка

 ,

gensym
()

Racket, объясните про lambda

Форум — Development

Учу потихоньку Racket. Раньше был такой код для вычисления дискриминанта:

(define (дискриминант a b c)
  (define bandb (* b b))
  (define fac ( * 4 a c))
  (- bandb fac))

И сам код для решения квадратного уравнение:

(define (квадратное_уравнение a b c)
  (define d (дискриминант a b c))
  (cond
    [(> 0 d)
     (print "Квадратное уравнение не имеет корней""")]
    [(equal? d 0)
     (/ ( - b) (* 2 a))]
    [(> d 0)
     (print "D:""")
     (println d)
     (print "X1"":")
     (println ( / ( + (- b) (sqrt d)) ( * 2 a)))
     (print"\n""X2:")
     (/ ( - ( - b) ( sqrt d)) ( * 2 a))]))
     
     
    (квадратное_уравнение -1 2 3) ;выводит 16 как и полагается


Теперь решил попробовать написать такую же решалку, только с использованием lambda:
#lang racket
(define (напечатать text)
  (println text))
(define two.x
  (lambda (a b c d)
    (( / ( + (- b) (sqrt d)) ( * 2 a)))
    (/ ( - ( - b) ( sqrt d)) ( * 2 a))))
(define x.one
  (lambda (a b)
    (/ ( - b) ( * 2 a))))

(define дискриминант
  (lambda (a b c)
    (let ([f 4])
      (define b.sqrt (* b b))
      (define four.a.c ( * f a c))
      (- b.sqrt four.a.c))))
(define квадратное_уравнение
  (lambda (a b c)
    (let ([D (дискриминант a b c)])
      (cond
        [(> 0 D)
         (напечатать "Квадратное уравнение не имеет корней")]
        [(equal? D 0)
         (x.one a b)]
        [( > D 0)
         (two.x a b c D)]))))


Но получаю данную ошибку:
. . application: not a procedure;
 expected a procedure that can be applied to arguments
  given: -1
  arguments...: [none]
Поясните мне, что я делаю не так?

P.S Дискриминант вычисляется

P.S.S gist кода для решения уравнений: url

 , ,

playX
()

Почему в scheme не любят set! ?

Форум — Development

Может, кто-нибудь знает, почему в Scheme (и в Racket) не приянто использовать set!, особенно в списках

Например, если мне надо список разделить на два по «выполняется/не выполняется условие», то в CL это будет выглядеть как

(defun split (list pred)
  (let ((res1 nil) (res2 nil))
     (dolist (l list)
        (if (pred l)
            (push l res1)
            (push l res2)))
     (values (nreverse res1) (nreverse res2))))

На Scheme полный аналог

(define (split list pred)
  (let ([res1 null] [res2 null])
     (for-each (lambda (l)
                 (if (pred l)
                    (set! res1 (cons l res1))
                    (set! res2 (cons l res2))))
          list)
     (values (reverse res1) (reverse res2))))

Но в учебниках по Scheme пишут, что так писать очень плохо, а надо так:

(define (split list pred)
   (define (loop list res1 res2)
     (cond
       [(null? list) (values (reverse res1) (reverse res2))]
       [else
         (if (pred (car list))
             (loop (cdr list) (cons (car list) res1) res2)
             (loop (cdr list) res1 (cons (car list) res1)))]))
   (loop list null null))
,мол, это понятнее.

Помогите понять, в чём смысл?

 , ,

monk
()

Помогите сделать макрос красивым

Форум — Development

Сделал, чтобы Racket мог создавать функции на основании их описания из GObjectIntrospection. Сейчас смотрю на то, что получилсоь и понимаю, что «настоящий программист может написать программу на ФортранеКоммон Лиспе на любом языке».

Задача стоит так: есть описание функции в виде описаний входящих и исходящих параметров (исходящие — значит по ссылке). _fun использовать нельзя, так как массив передаётся в FFI (и если исходящий, то собирается из) двух параметров: указатель + длина.

Прошу совета как сделать правильно. Сейчас build-function строит исходный текст подстановки макроса (в стиле defmacro), а затем build-ffi подтсавляет его в datum->syntax.

Если пытаться делать без datum->syntax, то вылазят две проблемы: что делать с локальными define'ами и как генерировать имена переменных. С другой стороны, надеюсь решить проблему с именаим параметров: у меня сейчас !arg — входящий параметр, %arg — он же, преобразованный в Си, &arg — указатель на него.

(define-syntax (define-gi-definer stx)
  (syntax-case stx ()
    [(_ id) #'(define-gi-definer id id)]
    [(_ id repository)
     (with-syntax ([string-rep (->string (syntax-e #'repository))])
       (repository-require (syntax-e #'string-rep))
       #'(define-syntax (id stx)
           (syntax-case stx ()
             [(_ object) 
              (with-syntax ([string-obj (->string (syntax-e #'object))])
                (hash-ref! instance-hash (cons string-rep (syntax-e #'string-obj)) 
                           (λ () (syntax-local-lift-expression 
                                  (build-ffi stx (syntax-e #'string-rep) (syntax-e #'string-obj))))))])))]))

(define-for-syntax (build-ffi stx rep obj)
  (define res (find-gi rep obj))
  (datum->syntax stx res))

(define (find-gi repository name)
  (define info (rep:find repository name))
  (unless info
    (raise-argument-error 'find-gi "name of object in repository" name))
  (define type (g-base-info-get-type info))
  (case type
    [(constant) (const-value info)]
    [(function) (build-function info)]))

(define (build-function info)
  (define %args (args info))
  (define (in-arg? arg) (memq (g-arg-info-get-direction arg) '(in inout)))
  (define (out-arg? arg) (memq (g-arg-info-get-direction arg) '(out inout)))
  (define (array-pos arg)
    (define type (g-arg-info-get-type arg))
    (if (eq? (g-type-info-get-tag type) 'array)
        (g-type-info-get-array-length type)
        -1))
  (define res-type-symbol (tag->symbol_type
                           (g-type-info-get-tag (g-callable-info-get-return-type info))))
  (define fun-type (append (list '_fun)
                           (for/list ([arg (in-list %args)])
                             (if (out-arg? arg) '_pointer ((tag->symbol_type
                                                            (g-type-info-get-tag (g-arg-info-get-type arg))))))
                           (list '-> res-type-symbol)))
  
  (define vector-lengths (for/list ([arg (in-list %args)] 
                                    #:when (> (array-pos arg) -1))
                           (list-ref %args (array-pos arg))))
  (define in-args (filter (λ (arg) (and (not (memq arg vector-lengths)) (in-arg? arg))) %args))
  (define out-args (filter out-arg? %args))
  (define ((prefix-name prefix) arg) (string->symbol (string-append prefix (g-base-info-get-name arg))))
  (define ref-name (prefix-name "&"))
  (define init-name (prefix-name "!"))
  (define parsed-name (prefix-name "%"))
  (define fun-args (for/list ([arg (in-list %args)]) 
                     (if (out-arg? arg)
                         (ref-name arg)
                         (parsed-name arg))))
  (define (array-of type-info) (g-type-info-get-tag (g-type-info-get-param-type type-info 0)))
  (define parse-exprs
    (for/fold ([define-parsed null])
      ([in-arg (in-list in-args)])
      (define type-info (g-arg-info-get-type in-arg))
      (define tag (g-type-info-get-tag type-info))
      (if (eq? (g-type-info-get-tag type-info) 'array)
          (cons `(define ,(parsed-name in-arg) (pvector-ptr ,(init-name in-arg) ,(tag->symbol_type (array-of type-info))))
                (if (> (array-pos in-arg) -1)
                    (cons `(define ,(parsed-name (list-ref %args (array-pos in-arg))) (pvector-length ,(init-name in-arg))) define-parsed)
                    define-parsed))
          (cons `(define ,(parsed-name in-arg) ,(init-name in-arg))))))
  (define-values (total define-outs set-outs out-refs)
    (call-with-values 
     (λ ()
      (for/fold ([sum 0] [define-outs null] [set-outs null] [out-refs null]) 
        ([out-arg (in-list %args)] #:when (out-arg? out-arg))
        (define type-info (g-arg-info-get-type out-arg))
        (define tag (g-type-info-get-tag type-info))
        (values (+ sum (ctype-sizeof (tag->_type tag)))
                (cons `(define ,(ref-name out-arg) ,(if (= sum 0) 'ptr `(ptr-add ptr ,sum))) define-outs)
                (if (in-arg? out-arg) 
                    (cons `(ptr-set! ,(ref-name out-arg) ,(tag->symbol_type tag) ,(parsed-name out-arg)) set-outs)
                    set-outs)
                (cond 
                  [(eq? tag 'array) 
                   (cons `(pvector ,(tag->symbol_type (array-of type-info)) 
                                   (ptr-ref ,(ref-name out-arg))
                                   ,@(if (> (array-pos out-arg) -1)
                                         (list `(ptr-ref ,(ref-name (list-ref %args (array-pos out-arg)))))
                                         null)) out-refs)]
                  [(not (memq out-arg vector-lengths)) 
                   (cons `(ptr-ref ,(ref-name out-arg) ,(tag->symbol_type tag)) out-refs)]
                  [else out-refs]))))
     (λ (sum l1 l2 l3) (values sum (reverse l1) (reverse l2) (reverse l3)))))
  `(let ([fun (get-ffi-obj ,(g-function-info-get-symbol info) #f ,fun-type)]) 
     (lambda ,(map init-name in-args)
       ,@parse-exprs
       ,@(if (> total 0)
             (append (list `(define ptr (malloc ,total)))
                     define-outs)
             null)
       ,(if (eq? res-type-symbol '_void)
            `(fun ,@fun-args)
            `(define res (fun ,@fun-args)))
       ,(if (eq? res-type-symbol '_void)
            `(values ,@out-refs)
            `(values res ,@out-refs)))))

Пример раскрытого макроса:
(let ((fun (get-ffi-obj "gtk_init" #f (_fun _pointer _pointer -> _void))))
   (lambda (!argv)
     (define %argv (pvector-ptr !argv _string))
     (define %argc (pvector-length !argv))
     (define ptr (malloc 8))
     (define &argc ptr)
     (define &argv (ptr-add ptr 4))
     (fun &argc &argv)
     (values (pvector _string (ptr-ref &argv) (ptr-ref &argc)))))

 , ,

monk
()

Скорость обработки массивов в разных лиспах и прочих яп

Форум — Development

Задача - создать массив случайных чисел на 3000000 элементов и замерить сколько времени займет нахождение суммы квадратов.

SBCL:

(defconstant +size+ 3000000)

(defparameter *vector* (map-into (make-array +size+ :element-type 'double-float) (lambda () (random 1.0d0))))

(defun sum-vec (v &aux (s 0.0d0))
  (declare (optimize speed (safety 0) (debug 0))
           (type (simple-array double-float (*)) v)
           (type double-float s))
  (dotimes (i (length v) s)
    (incf s (expt (elt v i) 2))))

(time (sum-vec *vector*))
$ sbcl --load bench.lisp
Evaluation took:
  0.009 seconds of real time
  0.012001 seconds of total run time (0.012001 user, 0.000000 system)

Racket

#lang typed/racket
(require racket/flonum)

(define Sz 3000000)
(define test-vec 
    (for/flvector #:length Sz ([i (in-range Sz)]) (random)))

(: sum-vec : FlVector -> Flonum)
(define (sum-vec v)
  (for/fold ([S 0.0]) ([e (in-flvector v)]) 
    (fl+ (fl* e e) S)))

(time (sum-vec test-vec))
$ raco exe bench.rkt
$ ./bench
cpu time: 20 real time: 22 gc time: 0

1. Можно ли код на racket еще улучшить?

2. Сколько времени занимает обработка в ваших языках? Особенно интересует ocaml и haskell

UPD. Думаю стоит пририсовать два нуля к размеру массивов, чтобы они не влезали целиком в кеши, олсо подумать там более произвольным доступом в к элементам.

 , , , ,

x4DA
()

Какой Lisp лучше в каких случаях и почему? И вообще в чём принципиальна разница между ними.

Форум — Development

И есть ли такой диалект лиспа который бы был одинаков для всей этой необъятной кучи смайлоязыков. Ну и до кучи объясните мне, зачем диалекты вообще нужны, ну вот зачем? Когда общий синтаксис которого нет одинаков, а новые возможности это просто сахар с верху и ключевые слова которые просто как расширения или там библиотеки можно делать, но зачем делать по сути. Не холивара ради, просто интересно.

Сабж.

 , , ,

Deleted
()

Упрощенная документация по Common Lisp

Форум — Development

 ,

Oxdeadbeef
()

Common Lisp 21-го века

Новости — Open Source
Группа Open Source

Начат проект по приведению Commons Lisp к нормам 21-го века.

  • Более объектно-ориентированный
  • Более функциональный
  • Разбиение стандартной библиотеки по пакетам
  • Добавление MOP - MetaObject Protocol
  • Синтаксис для регулярных выражений
  • Основан на чистом Common Lisp

Требования:

  • Любая современная реализация Common Listp (SBCL, Clozure CL, GNU CLISP или Allegro CL)
  • Quicklisp

>>> Подробности

 , ,

DiKeert
()

История интерактивных команд в Emacs

Форум — General

Переезжаю потихоньку с Vim на Emacs (+evil), в целом доволен - фич больше и работают они лучше, хотя конфигурировать его кратно сложнее для меня пока. В качестве starter kit взял Doom (develop branch) и доволен - он намного понятнее и легче Spacemacs.

Но появилась заноза. В emacs часто работа с интерактивной командой выглядит как M-x набор команды с Helm <RET> параметр в Helm <RET>, например:

M-x man <RET> bash <RET>
M-x customize-variable <RET> fill-column <RET>
M-x cd <RET> path <RET>

И это неудобно. Хочется иметь возможность:
1. Вернуться из второго интерактивного уровня в первый, т.е. отредатировать команду man, cd, etc.
2. «Перемещаться по истории команд» как в виме с ":<c-p>" - вернёт старую команду и даст мне её отредактировать. В случае с emacs я вижу это так:
M-x cd <RET> /some/long/path/to/dir <C-g>
M-x "жму волшебный хоткей" - емакс переключает меня в "cd" и подставляет /some/long/path/to/dir в Helm. 

Желательно чтобы работало в общем случае, а не отдельно для каждой интерактивной команды. Есть такое в природе?

UPD: в doom/evil есть какая-то эмуляция ":" в minibuffer, но аргументы там не работают. ":man bash" открывает просто «M-x man <RET>» и даже bash туда не подставляет.

 ,

snizovtsev
()

Как в emacs/spacemacs привязать тип буфера к конкретному окну?

Форум — Desktop

В emacs меня раздражает, что ты фиг когда угадаешь где откроется буфер. Там есть логика, но она где-то внутри модулей зашита.

Мне хочется сделать так, чтоб magit открывался только в окне 1, а основной редактор в окнах 2 и 3.

Разумеется можно исправить сам magit, но таких модулей больше чем дофига и хотелось бы найти какое-то централизованное решение.

 

zloelamo
()

real-auto-save скрыть сообщение Wrote

Форум — Development

real-auto-save хорош, только надо как-то скрыть раздражающее сообщение Wrote file-name. В идеале нужна функция, которая умеет фильтровать сообщения в minibuffer'e

 ,

Xwo
()

Emacs autoload packages

Форум — Desktop

В связи с настройкой Emacs, сталкиваюсь с ошибками. Похоже, это будет не первый пост на тему настройки...

EMACS 26.1!

Что-то подсматриваю в http://seancribbs.com/emacs.d

Задача: после копирования .emacs в ~/ и вызове редактора, подтягиваются при наличии сети все зависимости, прописанные в конфиге.

Недавно мне советовали:

(defvar required-packages
  '(список-пакетов))

(dolist (p required-packages)
  (when (not (package-installed-p p))
    (package-install p)))
Не подтягивает. В примере по ссылке выше:
(let ((refreshed nil))
 (when (not package-archive-contents)
  (package-refresh-contents)
  (setq refreshed t))

  (dolist (p seancribbs/packages)
    (when (and (not (package-installed-p p))
           (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install p))))
Ругается emacs: «Symbol's value as variable is void: pkg»
Я посмотрел, что такое assoc:
assoc item alist key(keyword) test(keyword) => cons cell or NIL
Во всей простыне по ссылке выше pkg не определён.

Вопрос: Как же правильно написать автоподтягивание пакетов, указанных в списке (defvar required-packages '(список-пакетов))?

Хм, после совета ниже, первый пакет проходит, а дальше появляется ошибка error: Package ‘web-mode-’ is unavailable (пакет любой, менял положение, например: error: Package ‘prettier-js-’ is unavailable...

 

Deleted
()

Emacs мультибуфер

Форум — General

Здравствуйте!

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

 

knigolaz
()

А как вы используете emacs?

Форум — Development

К этому вот
На сегодня emacs использовать с нуля как текстовый редактор не самое лучшее занятие - слишком высока кривая обучения и настройки, а список режимов, где emacs конкурентноспособен не так уж высок. Лучше VS Code, благо у MS он получился очень и очень.
Лично я использую emacs как усилитель Unix Way: из коробки lisp c IDE, eshell, который объеденяет s-выражения с системным shell-ом, куча удобных фич как из коробки, так и из репозитория. Все это вполне годно к разработке всяких прототипов, генерации и анализа данных и т.п. Раньше для этих целей я использовал python и интегрированный в emacs ipython.
А как используют emacs ЛОР-овцы?

 ,

cab
()

tcl vs rebol/red

Форум — Development

Ваши мысли.

Вот мои: конечно, круто иметь компилятор в натив, но я так понял, что до лиспа они всё же не дотянули в этом плане. Но, допустим, тут они побеждают tcl.

С другой стороны, классно иметь множество типов, но формат даты типа 1-Jan-1990 не дают никакого шанса на локализацию. Да и вообще, после опыта лиспа сложность определения типа литерала выглядит явным путём не туда. ПРоблема здесь в том, что все форматы встроенных типов данных (насколько я понял), глобальны. Т.е. если я хочу свой DSL, я быстро могу вступить в конфликт. Даже и внутри самого языка такой конфликт есть. Например, 123.45 - это число, 123.45.6 - это tuple из 123.45.6 . А если я хочу tuple из двух чисел 123 и 45 ? Кривота получается.

С другой стороны, есть сходства: очень гибкий и простой синтаксис, батарейки, кросс-платформенность.

Соответственно, ваши мнения. Может быть, кому-нибудь пришлось на red/rebol что-то делать.

 , , ,

den73
()

Современный быстрый RPC

Форум — Development

Хочу написать программу. Идеологически хочу её сделать как пачку микросервисов, но не хочу привязываться к конкретному языку программирования.

Поэтому нужен протокол для общения между микросервисами. Нашёл https://github.com/hprose : высокая скорость, много поддерживаемых языков. Но хочу уточнить, может есть уже что-то более популярное.

 , независимость от языка,

monk
()