LINUX.ORG.RU

72
Всего сообщений: 170

Не могу написать код по заданному алгоритму

Граждане и гражданки ЛОР не дайте свихнуться, а дайте код на Lisp или Scheme

у меня два списка (а1 а2 а3 ... an) (Р0 Р1 Р2 ... Pn)

в первом проходе получаю списки (а1) (Р0) и решение такого ур-ия

M1 = P0 * a1

в втором проходе получаю списки (a1 a2) (P0 P1) и решение такого ур-ия

M2 = P0 * a2 + (P1 * (a2 - a1))

в третьем проходе плучаю списки (a1 a2 a3) (P0 P1 P2) и решение такого ур-ия

M3 = P0 * a3 + (P1 * (a3 - a1) + P2 *(a3 - a2))

ну и т.д.

Общее уравнение

 i
 Mn = P0 * an + ΣPi * (an - ai)
 i=1

мозги колом встали

 ,

saufesma ()

Добавьте пример letrec

r5rs приводит пример

(letrec ((even?
          (lambda (n)
            (if (zero? n)
                #t
                (odd? (- n 1))))) ;; ---> <bindings> should have 
                         ;;the form ((<variable1> <init1>)
                         ;;в данном случае
                         ;;<variable1> n
                         ;;<init1> (lambda (n) ...)
         (odd?
          (lambda (n)
            (if (zero? n)
                #f
                (even? (- n 1)))))) ;;---> <bindings>
  (even? 88)) ;;---> <body>

library syntax: (letrec <bindings> <body>)

Из-за того что

library procedure: (odd? n)

library procedure: (even? n)

These numerical predicates test a number for a particular property, returning #t or #f.

пример выглядит не совсем понятным.

Бросьте более читаемый примерчик использования letrec.

 

saufesma ()

Racket Scheme. Разделить каждый элемент первого списка на каждый элемент второго списка.

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

 ,

stzky ()

Кому надо было diff?

Тут на форуме второй раз поднимается тема диффа с расстоянием Левенштейна, в связи с чем я вспомнил, что писал как-то подобную функцию на Racket для тренажера азбуки морзе, чтобы оценивать количество ошибок. Только у меня не расстояние Левенштейна, а немного более «умная» функция.

Подправил для более универсального применения, получилась функция для диффа списков: https://github.com/punzik/scheme-list-diff

Протестировать можно так:

$ racket list-diff-test.rkt connect conehead

Disclaimer:
Не пытайтесь сравнивать списки длиной более 500 элементов, не хватит памяти! На полутора тысячах оно отожрало 30 гиг и было убито oom-киллером 👍

 , ,

Puzan ()

Racket Scheme. Вычислить и представить в виде списка полином Лежандра.

Здравствуйте, делал математические вычисления на scheme. И у меня возникла потребность вывести результаты вычисления в виде списка, на чем я собственно и застрял.

Задание: Вычислить и представить в виде списка полином Лежандра Pk: P0 = 1, P1 = x, Pn+1 = ((2n + 1)xPn − nPn−1)/(n + 1).

Я переделал формулу для просто Pn-ого члена для удобства вычисления. Pn = ((2n-1)*x*P[n-1] - (n-1)*P[n-2])/(n). Формула в виде картинки, Pn-ого члена, которая получилась

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

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

( читать дальше... )

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

( читать дальше... )

В связи с плохими знаниями функционального программирования и scheme в частности, у меня возник вопрос, а можно ли найти способ более элегантно занести результаты в список?

 ,

stzky ()

Racket Scheme. Рекурсивное деление полиномов с остатков (через списки)

Привет. Решил поработать с полиномами и списками в Racket и столкнулся с задачей деления. Попробовал реализовать и пока получается не очень. Допустим, есть 2 полинома: 2 + 3х -х^3 + x^4 и 8 - 3х + 4х^2 + x^3, 1ый полином делим на 2ой. В качестве параметра функции я указываю 2 листа (это мои коэффициенты), то есть (pa/pb(list 2 3 0 -1 1)(list 8 -3 4 1 0)), а ответом должны быть листы результат полинома и остаток, ну или все в один список. Я реализовал программу деления почленно, но это не верно, так как оно делается по другому и я не могу придумать алгоритм правильного деления с рекурсией.

(define pa/pb
  (lambda (pol1 pol2)
    (if (null? pol1)
        pol2
        (if (null? pol2)
            pol1
     (cons (/ (car pol1) (car pol2))
           (pa/pb (cdr pol1) (cdr pol2))
     )
    )
   )
  )
)

 ,

Wonka ()

Idris 2 теперь стал self-hosted

https://github.com/edwinb/Idris2-SH

Ура товарищи!

 , , , ,

kookoo ()

DrRacket and elisp окончательно запутался

Не могу понять уже, что я тут писал, всего-то нужна функция которая режет лист на две части и возвращает левую часть то, что я написал на ракете, не работает и не пойму почему

#lang racket
(define *distance-lst* (list 1 2 3 4 5 6))

(define *A-distance* 3)
(define *left-A-lst* '())

(define d-lst (length *distance-lst*))
(define *output-lst* '())
(define (slice input-lst a output-lst)
  (if (< (first input-lst) a)
      (slice (cons (first input-lst) output-lst)
             a
             (set! input-lst (rest input-lst)))
      output-lst))
     
;;(define (split-lst lst-input a lst-output)
;  (if (< (first lst-input) a)
 ;     (split-lst (set! lst-input (rest lst-input))
  ;                     a
   ;                    (set! lst-output
    ;                         (cons
     ;                         (first lst-input) lst-output)))
 ; lst-output))

(slice *distance-lst* *A-distance* *left-A-lst*)

и вот на elisp и работает как надо, задолбало, что не так не могу понять эту ракету

(defun slice (input-lst a output-lst)
(if (< (car input-lst) a)
(slice (cdr input-lst) a (push (car input-lst) output-lst))
output-lst))

(nreverse (slice '(1 2 3 4 5 6) 5 '()))

 ,

saufesma ()

Научно-практическая конференция Scheme and Functional Programming Workshop 2020 открывает подачу заявок на доклады

Простите, друзья, копипаста с Хабра, но я надеюсь, что здесь есть люди, которым это было бы интересно:

https://habr.com/ru/post/495050/

Научно-практическая конференция Scheme and Functional Programming Workshop 2020 открывает подачу заявок на доклады.

Scheme and Functional Programming Workshop — это ежегодное мероприятие, научно-практическая конференция, на которой собираются специалисты про языкам программирования, эстетически или технологически отвечающим основным принципам, заложенным в Алгоритмическим Языке Scheme: минимализму, сохраняющему универсальность, и тщательному проектированию, обеспечивающему гибкий дизайн.

От докладчиков ожидаются статьи о передовых научных результатах, а также отчёты о практических достижениях, как в инженерной, так и в образовательной сферах, а также развёрнутые предложения по рассмотрению идей сверх-ранней стадии или переосмыслению старых подходов. Приветствуются и поощряются работы, имеющие отношение к любым языкам, входящим в семейство Scheme: от чистых подмножеств RnRS, до «вариаций на тему Схемы», таких как Racket, других диалектов Lisp, включая Closure, Emacs Lisp, Common Lisp, и иных функциональных языков, поддерживающих замыкания и/или макросы (или имеющих таковую поддержку в средствах расширения языка, например, библиотеках). Примерами подобных могут являться Dylan, ECMAScript, Hop, Lua, Scala, Rust и ещё множество других. Общая элегантность работы и релевантность заявленной тебе будут являться более важным критерием оценки, нежели отдельные элементы синтаксиса, в котором реализованы примеры.

Наиболее интересующие темы включают (но не исчерпываются):

  • Взаимодействие с разработчиком: средства написания программ, интегрированные среды разработки, отладка, тестирование и рефакторинг
  • Реализация вычислительных движков: интерпретаторы, компиляторы, инструменты, сборщики мусора, бенчмарки
  • Средства расширения языка: макросы, гигиена, доменно-специфичные языки, рефлексия, а так же как таковые влияют на процесс разработки
  • Выражения: средства управления, модульность, полиморфизмы разных видов, типы, аспекты, модели владения, параллельные вычисления (конкурентные вычисления, многопоточность), иные способы параллельного выполнения, недетерминированные вычисления, вероятностные вычисления, и тому подобное
  • Средства интеграции: инструменты сборки, развёртывания, взаимодействия с другими языками и системами
  • Формальная семантика: теория, анализ и преобразования, частичное выполнение (partial evaluation)
  • Человеческий фактор: прошлое, настоящее и будущее, эволюция и социология языке Scheme, стандарт и диалекты
  • Образование: подходы, практические отчёты, образовательные программы
  • Приложения: промышленные применения Scheme
  • Искусство: элегантные и красивые трюки и применения Scheme

Даты

  • Окончание подачи заявок: 15 Мая 2020
  • Уведомление о рассмотрении заявок 12 Июня 2020
  • Финальные версии работ для печати: 30 Июня 2020

Под датой дедлайна подразумевается таковая в любой точке Земли (23:59 UTC-12)

Формат подачи

Финальные бумажные версии работ должны использовать формат acmart и подформат acmlarge. Они должны быть в PDF, и допускать печать на бумаге формата US Letter. Microsoft Word/LaTeX шаблоны можно скачать:

http://www.sigplan.org/Resources/Author/

Этот формат согласуется с общепринятым форматом конференций ACM (включая ICFP, которая проходит в том же месте в то же время). Рекомендуеся использовать опцию «review» для нумерации строк, это упрощает рецензирование.

Конференция приветствует все возможные виды докладов, включая полноценные научные статьи, практические отчёты и блиц-доклады (lightning talks). Статьи и отчёты ограничены в объёме 14 страницами, но и меньшие размеры приветствуются. Блиц-доклады ограничены 192 словами. На каждую статью или доклад отводится слот в 25 минут, включая вопросы. На блиц-доклад отводится два пятиминутных слота, один для доклада и один для вопросов.

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

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

Труды конференции (Proceedings) будут опубликованы в формате технического отчёта (Technical Report) Мичиганского Университета (University of Michigan), а также загружены на http://arXiv.org

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

Ссылки

Персоналии:

Оргкомитет

  • Michael D. Adams (Program Co-Chair), University of Michigan
  • Baptiste Saleil (Program Co-Chair), IBM Canada
  • Jason Hemann (Publicity Chair), Northeastern University

Программный комитет

  • Michael D. Adams (Program Co-Chair), University of Michigan
  • Baptiste Saleil (Program Co-Chair), IBM Canada
  • Maxime Chevalier-Boisvert, Université de Montréal
  • Ryan Culpepper, Czech Technical University
  • Kimball Germane, University of Utah
  • Yukiyoshi Kameyama, University of Tsukuba
  • Andy Keep, Cisco Systems, Inc
  • Julien Pagès, Université de Montréal
  • Alexey Radul

Направляющий комитет

  • Will Byrd, University of Alabama at Birmingham
  • Will Clinger, The Larceny Project
  • Marc Feeley, Université de Montréal
  • Dan Friedman, Indiana University
  • Olin Shivers, Northeastern University

 , , ,

Lockywolf ()

Куда помещать табличные данные для програмки

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

 

saufesma ()

Что почитать по Guile

Решил ознакомиться со Scheme и глаз зацепился за Guile. У них есть мануал, но я не уверен, насколько он полноценный.

До этого ни с каким лиспом дела не имел, но со скобочками я на ты (objc). Будет ли достаточно этого мануала, чтобы уверенно изучить синтаксис, семантику, ооп и тд? Есть ли еще мануалы с Best Practice и общепринятыми тулзами, типа линтеров, менеджеров зависимостей, юнит тестами, CI.

(в Talks постить не могу, так что сорян, если мимо)

 , ,

rbbtnspc ()

Посоветуйте редактор для рисования схем

Посоветуйте простой редактор для рисования схем (гидравлических).

Желаемые возможности:

  • Возможность создания своей библитеки компонентов
  • Экспорт в svg

Т.е. linux-аналог sPlan

 , , ,

nvl ()

Концептуальный дистрибутив - почти lisp os? :)

Всем привет. Не использовал Linux на десктопе несколько последних лет, но с 2011 активно использую на серверах (в основном debian), походу многое пропустил - и у нас появился (потенциально?) нормальный дистр, которым можно пользоваться? Речь о GuixSD. Почти lisp os, лол: guix один из самых продвинутых менеджеров пакетов (и не только?), shepherd - нормальный и переносимый вириант System V, stumpwm и next browser в активной разработке, emacs как ide.

Хотел узнать, на сколько актуально и какие юз-кейсы использования guix поверх других дистров, например gentoo, или arch? Кто совмещает с debian? Какие сейчас основные issues в проекте GuixSD? Чем shepherd лучше других систем инициализации, кроме того, что он на scheme, что само по себе огромный плюс?

 , , , ,

alienclaster ()

Странное поведение кода DrRacket

Здесь код в котором не могу сообразить

#lang racket
(define sum-of-first
  (lambda (n)
    (if (= n 1)
        1
        (+ (sum-of-first (- n 1))
           n))))

например, ввожу, в debugger
(sum-of-first 4)
работает только эта часть
(sum-of-first (- n 1))
полученный результат складывается в stack, в данном случае это
4
3
2
1 и вот здесь я поплыл т.к. в этом месте
(if (= n 1)
        1
код должен вылететь, а он нет, он начинает отрабатывать сумму
(+ (sum-of-first (- n 1))
           n)

Как это понять?

Вижу, что въехать в рекурсию не могу, на emacs то же самое, только debugger отсутствует

Пример из Concrete abstraction

 

saufesma ()

GNU Guile 2.9.4

Пару часов назад состоялся релиз GNU Guile 2.9.4 — реализации языка программирования Scheme. Помимо активной работы над JIT-компиляцией на платформах x86-64, i686, ARMv7 и AArch64, оптимизированы операции над числами с плавающей точкой, объявления верхнего уровня стали инлайниться на этапе компиляции, ускорена работа вложенного define и изменилось поведение компилятора при нахождении выражений, предшествующих внутренним объявлениям переменных.

Новость / Анонс

 , , , ,

gnulag ()

Вопрос про гигиенические макросы

Реализация у меня - guile. Мне интересен аналог вот такого гипотетического макроса на CL:

(defmacro define-handler (name
                          ;; далее идут опции кодогенерации
                          ;; обычно это так называемый plist
                          ;; где значения у ключей это символы, T, NIL
                          (&rest code-options)
                          &body code)
  (let ((binds
          ;; тут довольно сложная обработка опций, где я частенько пользуюсь
          ;; и CLOS
          (handle-code-options code-options)))
    `(let ;; тут let чисто для компактности, хотя результат обработки опций
         ;; может потребовать подключения let*, flet и прочего с приличным
         ;; количеством генерируемого кода
         ,(handle-code-options code-options)
       ,@code)))

Какие формы надо изучать, чтобы писать такое на гигиенических макросах?

 ,

ados ()

Вопрос про гигиенические макросы

Здравствуйте, мои маленькие любители макросов!

Есть такой макрос на CL:

(defun has-tag-p (tag record) ... )

(defmacro select (query records)
  (let ((rec (gensym "record")))
    (labels ((query-helper (q)
               (if (and (listp q)
                        (member (car q) '(and or not)))
                   `(,(car q) ,@(mapcar #'query-helper (cdr q)))
                   `(has-tag-p ,q ,rec))))
      `(remove-if-not (lambda (,rec) ,(query-helper query)) ,records))))

Аналогичный макрос (без гигиены) на guile:

(define (has-tag? tag record) ... )

(define-macro (select query records)
  (define rec (gensym "record"))
  (define (query-helper q)
    (if (and (list? q)
             (memq (car q) '(and or not)))
        `(,(car q) ,@(map query-helper (cdr q)))
        `(has-tag? ,q ,rec)))
  `(filter (lambda (,rec) ,(query-helper query)) ,records))

Вопрос: как написать такое же, но с гигиеной, используя (1) только стандарт R5RS, (2) стандарт R7RS, (3) Racket?

Призываю @monk’а и прочих знатоков Scheme.

Ну и с интересом выслушаю замечания бывалых лисперов по приведённому коду.

 , , , ,

aeralahthu ()

Прмер из DrRacket не запускается

Пример находится

https://docs.racket-lang.org/quick/

11. Objects

#lang racket
(require racket/class
         racket/gui/base)
(define f (new frame% [label "My Art"]
                      [width 300]
                      [height 300]
                      [alignment '(center center)]))

(define (add-drawing p)
  (let ([drawer (make-pict-drawer p)])
;;make-pict-drawer: unbound identifier in module in: make-pict-drawer
    (new canvas% [parent f]
                 [style '(border)]
                 [paint-callback (lambda (self dc)
                                   (drawer dc 0 0))])))

Что я промухал?

 

saufesma ()

Scheme SRFI-29

Как правильно его использовать?

В SRFI приведён пример:

(if (not (load-bundle! bundle-name))
                    (begin
                     (declare-bundle! bundle-name (cdr translation))
                     (store-bundle! bundle-name)))) 

Но ведь в этом случае, если translation будет изменён после первого запуска, то при запуске будет использоваться старая версия: (load-bundle! bundle-name) загрузит старую сохранённую версию и вернёт #t.

Просто писать declare-bundle!, а остальное игнорировать? Или делать макрос со сторонним эффектом времени компиляции?

 ,

monk ()

Помогите кроваво пропатчить

С помощью модуля (web client) (guile 2.2.4) запрашиваю некий сервер и тот оставляет мусор в заголовке:

scheme@(guile-user)> (define myx (http-get site))
web/http.scm:479:8: In procedure parse-non-negative-integer:
Bad non-negative-integer header component: 0; must-revalidate; no-cache


Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In current input:
   678:12  6 (_)
In web/client.scm:
   386:24  5 (http-request _ #:body _ #:port _ #:method _ #:version _ #:keep-alive? _ # _ # _ …)
In web/response.scm:
   200:48  4 (read-response #<input-output: string 560a19106b60>)
In web/http.scm:
   225:33  3 (read-headers #<input-output: string 560a19106b60>)
   195:11  2 (read-header #<input-output: string 560a19106b60>)
   529:23  1 (lp _)
    479:8  0 (parse-non-negative-integer "0; must-revalidate; no-cache" _ _)
scheme@(guile-user) [1]> 

На первый взгляд косяк элементарный, но я в схеме новичок и поэтому читаю этот http.scm с данными из бэктрейса и не могу понять куда впатчить предварительную обработку строки.

 , ,

ados ()