LINUX.ORG.RU

Вышел язык программирования Racket 7.0

 , ,


4

3

Racket - это язык программирования общего назначения, а также первая в мире экосистема для языко-ориентированного программирования.

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

Ядро версии 7.0 является результатом переработки ядра версии 6.12 более чем на 1/8, и включает новый механизм раскрытия макросов, который осуществляет бутстрэппинг самого себя. Данный механизм покрывает более 40% кода, необходимого для замены ядра Racket на Chez Scheme. Остальные 60% кода, по бОльшей части, также реализованы, но не включены в этот выпуск; мы надеемся и предполагаем, что Racket-на-Chez будет готов для промышленного использования в следующих выпусках ветки 7.x

  • Синтаксис формы (`#'`) поддерживает новые шаблоны подформ: ~@ - для сплайсинга, и ~? - для выбора между подшаблонами, основанного на возможном «отсутствии» значения у переменных образца (например, у образца ~optional в syntax-parse). Библиотека syntax/parse/experimental/template, откуда происходят эти возможности, экспортирует новые формы под старыми именами для совместимости.
  • На Windows флаг --embed-dlls команды raco exe создаёт по-настоящему автономный исполняемый файл ".exe", который содержит в себе разделяемые библиотеки Racket.
  • Опция «Create Executable» интегрированной среды разработки DrRacket для учебных языков (Beginner Student, и т.п.) использует флаг --embed-dlls на Windows.
  • Поддержка prefab («previously fabricated») структур в Typed Racket существенно улучшена, что делает их более полиморфными, исправляя, вместе с тем, существенные ошибки текущей реализации. Программы, которые сейчас используют предикаты для prefab-структур неизвестных данных, могут нуждаться в ревизии, т.к. предыдущие версии Typed Racket позволяли программам с потенциальными ошибками осуществлять проверку типов. Смотрите Typed Racket RFC 1 и prefab-changes для более подробной информации об этом изменении, и о том, как исправить программы, которые подверглись влиянию в связи с этим изменением.
  • Typed Racket поддерживает #:rest-star в конструкторе типов ->*, что позволяет функциональным типам указывать в хвостовом списке аргументов (rest arguments) более сложные образцы типов, такие как функция hash.
  • Интерактивные оверлеи могут быть наложены на графики, созданные с помощью plot-snip. Это позволяет создавать интерактивные графики или отображать дополнительную информацию, когда указатель мыши находится над областью графика. Примеры использования данной возможности можно посмотреть тут.
  • racket/plot предоставляет процедуры для отображения графиков японских свечей (candlestick charts), которые могут быть использованы в финансовом анализе временных рядов.
  • Добавлен contract-equivalent?, который проверяет, что два контракта являются взаимосильными, без экспоненциального замедления, которое имеет место в случае двух вызовов contract-stronger?.
  • Lazy Racket поддерживает функции с именованными аргументами.

>>> Оригинал



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

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

Ещё чуть оптимизировал реализацию умножения комлексных чисел. Вот последние тесты:

Racket 6.11:

$ time ./mad2 10000000 debug
0.04161263083703627+0.010907804918643873i
real    0m1,293s
user    0m1,228s
sys     0m0,076s

Racket 7.0:

$ time ./mad2 10000000 debug
0.04161263083703627+0.010907804918643873i
real    0m1,380s
user    0m1,340s
sys     0m0,044s

Java:

$ time java Mandelbrot 10000000 debug
0.04161263083703627 + 0.010907804918643873i

real    0m0,626s
user    0m0,776s
sys     0m0,072s

monk ★★★★★
()
Ответ на: комментарий от icefreeze

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

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

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

Ты не написал, как их применять, а сам я посчитал их отдельными.

Но я дважды наглядно применил оба критерия последовательно.

Так ты попробовал? Бритва заработала?

но принципиальной, качественной разницы нет

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

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

Я уже пояснил про историю.

Так и почему ж ты хочешь отнять у них этот удобный им инструмент и всучить неудобный? Чтобы больше работали и не выёживались? Тут мне опять начинают мерещиться лозунги вроде «аrbeit macht frei».

Отнимать я не предлагал, про стремление (не моё) к абсолюту упоминал, что конкретно предлагаю делать с капризными программистами уже рассказал.

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

WitcherGeralt, вот ты говоришь о фундаментальных проблемах. У меня есть одна фундаментальная проблема, которую lisp очень хорошо решает. За 20 лет практики я использовал где-то десяток языков. За это время фан остается только от lisp. Кроме того, я на нем решаю некоторые задачи и он там очень и очень в тему (text processing, emacs lisp). Я мог бы и на java, но дольше и без фана. Или на python тоже без фана. При этом я не считаю себя хорошим лиспером, так, конфиги к emacs напейсать, моду поправить - мой потолок где-то год назад.

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

cab ★★★★
()
Последнее исправление: cab (всего исправлений: 1)
Ответ на: комментарий от monk

Спасибо. Я подозревал, что есть шаманство, через которое можно значительно ускориться.

Если проставить типы для Racket (иначе он комплексную арифметику делает в предположении, что там могут быть числа произвольной точности), тогда

С лиспом та же история. Похоже, в сообществе принято делать тип complex максимально общим.

ugoday ★★★★★
()
Ответ на: комментарий от cab

Заявка принята. Но я не настоящий сварщик, а без С этот тест выглядит неполным.

Кто бы мне помог с сишным вариантом, я был бы очень благодарен.

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

С лиспом та же история.

В лиспе есть (complex single-float), а в Racket все операции над комплексными числами только безопасные (то есть с проверкой типа при каждой операции). Приходится на структурах велосипедить.

monk ★★★★★
()
Ответ на: комментарий от ugoday
#include <complex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

double complex mand(int n, double complex c)
{
  double complex z = 0;
  int i;
  for(i = 0; i<n; i++) {
    z = z*z+c;
  }
  return z;
}

int main(int argc, char **argv)
{
  int n = atoi(argv[1]);
  double complex c = 0.04 + 0.01*I;
  double complex z = mand(n, c);
  if(strcmp(argv[2],"debug") == 0) printf("%f = %fi\n", creal(z), cimag(z));
}
monk ★★★★★
()
Ответ на: комментарий от cab

Ты о чём? Как ни странно, но про лисп мы не говорим. Хотя тред начался как раз с моей аргументации в пользу лиспа (затем поскаль, затем фортран, затем фундаментальные проблемы, лол).

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

В контексте фрагментации мы обсуждали джаву и скалу, какое у них впринципе может быть подмножество?

WitcherGeralt ★★
()
Ответ на: комментарий от monk

С чего это?

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

Настолько же, насколько им является фортран или си

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

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 2)
Ответ на: комментарий от WitcherGeralt

Ты о чём?

Лисп, тот язык, которому «не место» - устарел, должен сдохнуть и т.д. И он фрагментирован, все реализации достаточно разные. Однако я продуктивно работаю на emacs lisp имея не сказать, чтобы глубокие познания.

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

Я уже пояснил почему (альтернатив просто нет) в случае лиспа устаревание не работает, а аргумент про фрагментацию нельзя применить к лиспу в целом, только к конкретной реализации, например к сабжу.

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

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

Исключительно потому, что на других языках больше специалистов. И потому что на других языках есть библиотеки для веб-сервисов, не вызываемые стандартным образом. Та самая фрагментация. Поэтому же нет коммерческих веб-сервисов на фортране, си, паскале, ... Если бы все библиотеки имели интерфейс extern «C», то можно было бы и на ассемблере ваять.

То есть в полной мере?

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

И писать под неё не сложнее, чем писать на Си под Линукс. Разве, что строчек чуть больше.

monk ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Я уже пояснил почему (альтернатив просто нет) в случае лиспа устаревание не работает

та ладно, еще как есть. Те же java или python. Но фана нет.

cab ★★★★
()
Ответ на: комментарий от ugoday

CCL

(defun mandelbrot2 (c n z)
  (declare (optimize (speed 3) (safety 0) (debug 0)))
  (declare (type (and fixnum unsigned-byte) n))
  (declare (type (complex single-float) c z))
  (if (= n 0) z
    (mandelbrot2 c (the fixnum (- n 1))
		 (the (complex single-float) (+ (* z z) c)))))

(defun mandelbrot (c n z)
  (if (= n 0) z
    (mandelbrot c (- n 1) (+ (* z z) c))))

(defun main ()
  (let* ((n 1000000000))
	  (format t "z: ~a~%" (mandelbrot2 #C(0.04 0.01) n #C(0.0 0.0)))
    (quit)))

$ /usr/bin/time -f %e ./lx86cl64 --load PttcJedT.lisp --eval '(main)'
z: #C(0.04161263 0.010907805)
8.83
l$ /usr/bin/time -f %e python3.5 NbqZc9JV.py 1000000000 1
63.63

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

CCL без оптимизаций тормознее, чем python:

$ /usr/bin/time -f %e ./lx86cl64 --load PttcJedT.lisp --eval '(main)'
z: #C(0.04161263 0.010907805)
98.67
ugoday, проверь как на sbcl.

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

(let* ((n 1000000000))

Так нельзя. Читай из командной строки. Си/си++ такой код вообще в печать готового результата могут скомпилировать.

monk ★★★★★
()
Ответ на: комментарий от cab

SBCL у меня:

$ ./run-sbcl.sh --noinform --eval "(compile-file \"PttcJedT.lisp\")" --eval "(quit)" > /dev/null
# /usr/bin/time -f %e ./run-sbcl.sh --noinform --load "PttcJedT.fasl" --eval "(main)" --quit --end-toplevel-options "$@"
z: #C(0.04161263 0.010907805)
4.82

cab ★★★★
()
Ответ на: комментарий от monk

ни на что не повлияло

/usr/bin/time -f %e ./lx86cl64 --load PttcJedT.lisp --eval '(main 1000000000)'
z: #C(0.04161263 0.010907805)
8.89
$ /usr/bin/time -f %e ./run-sbcl.sh --noinform --load "PttcJedT.fasl" --eval "(main 1000000000)" --quit --end-toplevel-options "$@"
z: #C(0.04161263 0.010907805)
4.82
сделано специально quickly and dirty, чтоб не разбираться в особенностях реализаций. До кучи, неоптимизированный SBCL выполняется за 85.61 сек.

cab ★★★★
()
Последнее исправление: cab (всего исправлений: 4)
Ответ на: комментарий от cab
Mandelbrot.java:
public class Mandelbrot {

    // return number of iterations to check if c = a + ib is in Mandelbrot set
    public static Complex mand(Complex z0, int max) {
        Complex z = new Complex(0,0);
        for (int t = 0; t < max; t++) {
            z = z.times(z).plus(z0);
        }
        return z;
    }

    public static void main(String[] args)  {
        int n   = Integer.parseInt(args[0]);
        Complex c = new Complex(0.04, 0.01);
        Complex z = mand(c, n);
        if(args[1].equals("debug")) System.out.println(z);
    }
}

и Complex.java с выкинутым main.

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

Java 8

$ /usr/bin/time -f %e java Mandelbrot 1000000000 debug
0.04161263083703627 + 0.010907804918643873i
5.51
$ /usr/bin/time -f %e java Mandelbrot 10000000 debug
0.04161263083703627 + 0.010907804918643873i
0.12

cab ★★★★
()
Ответ на: комментарий от monk

Сишечка

l$ /usr/bin/time -f %e ./Mandelbrot 10000000 debug
0.041613 = 0.010908i
0.18
$ /usr/bin/time -f %e ./Mandelbrot 1000000000 debug
0.041613 = 0.010908i
17.76

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

Я уже пояснил почему (альтернатив просто нет) в случае лиспа устаревание не работает

та ладно, еще как есть. Те же java или python. Но фана нет.

Если елисп доставляет больше фана, чем питон, то с человеком что-то не то.

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

С фаном, как с женщинами, никогда не знаешь на что западешь :)

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

Аналог в данном случае — это чисто функциоральный язык. Есть Эрланг, но он не компиляемый. Есть хаскель, но сильно сложнее.

WitcherGeralt ★★
()
Ответ на: комментарий от monk

Не, я по сишечке не спец. С -O3

$ /usr/bin/time -f %e ./Mandelbrot 10000000 debug
0.041613 = 0.010908i
0.13
$ /usr/bin/time -f %e ./Mandelbrot 1000000000 debug
0.041613 = 0.010908i
10.10

cab ★★★★
()
Ответ на: комментарий от WitcherGeralt

Аналог в данном случае — это чисто функциоральный язык.

С чего ты взял? Аналог - это то, на чем можно за сопоставимую цену сделать ту же задачу.
emacs lisp тоже не компиляет в натив, как python или java (да, я в курсе про jit).
Но в нем куча инструментов для работы с текстом, возможность запускать скрипты из командной строки, в комплекте удобная IDE, eshell и REPL. И он быстрее python. Мегаудобно.

cab ★★★★
()
Ответ на: комментарий от Virtuos86

Если елисп доставляет больше фана, чем питон, то с человеком что-то не то.

Да ладно, даже Гвидо и тот сбежал :-) На самом деле, я не знаю для чего нужен Python. Он тормозной, он не умеет в нормальную многопоточность, слабая типизация, дурацкие оступы (посмотрели на Лисп и решили убрать скобки, заменив их табами, и заставив всех своих последователей соблюдать дисциплину форматирования кода, лол). Я не знаю зачем его используют, зачем он вообще нужен этот Питон.

azelipupenko
() автор топика
Ответ на: комментарий от cab

Аналог - это то, на чем можно за сопоставимую цену сделать ту же задачу

Я-то согласен, но ты попробуй объяснить это функциональщикам.

WitcherGeralt ★★
()
Ответ на: комментарий от Hertz

Доктор, лечение назначите?

Каков срок развития болезни? Если больше 1,5-2 лет, то лечение только навредит. Постарайтесь побольше улыбаться и радоваться жизни.

Virtuos86 ★★★★★
()
Ответ на: комментарий от azelipupenko

emacs lisp

(require 'cl-lib)

(defun sumfirst (n)
  (let ((s 0))
    (cl-do ((i 0 (+ i 1)))
        ((> i n) s)
      (setf s (+ s i)))))

(print (sumfirst 10000000))

python
def sumfirst(n):
    i = 0
    res = 0
    while i < n:
        res += i
        i += 1
    return res


print(sumfirst(10000000))

запускаем
~ $ /usr/bin/time -f %e emacs --script sumfirst.el

50000005000000
2.00
~ $ emacs --batch --eval '(byte-compile-file "sumfirst.el")'
#Скомпилированная версия выдает совсем другой результат
~ $ /usr/bin/time -f %e emacs --script sumfirst.elc

50000005000000
0.41
~ $ /usr/bin/time -f %e python2 sumfirst.py
49999995000000
0.4
~ $ /usr/bin/time -f %e python3 sumfirst.py
49999995000000
0.73

cab ★★★★
()
Последнее исправление: cab (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Бритва заработала?

Нет. Если критерий А обязателен, то уже на нём всё обламывается и не работает так, как ты предполагаешь

А) Проблема сужает область применения языка.

Как тебе уже несколько раз указали в этом треде, на асме можно решать те же задачи, что и на сишечке, разве что не так удобно и писанины больше.

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

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

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

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

что конкретно предлагаю делать с капризными программистами уже рассказал.

Ты, насколько я помню, предлагал им больше учиться. Только вот почему-то предполагаешь, что выучившись они начнут соглашаться с твоими критериями. А я в этом сильно сомневаюсь.

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

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

Я-то согласен, но ты попробуй объяснить это функциональщикам

Так я с тобой спорю, а не с ними.

cab ★★★★
()
Ответ на: комментарий от azelipupenko

Я не знаю зачем его используют, зачем он вообще нужен этот Питон.

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

Медленный для чего? Что значит «медленный»? Слабая типизация — что? Слабая типизация в JS, PHP, частично в Perl, но никак не в питоне. «Дурацкие» отступы мешают только при генерации кода.

Из всего списка остается одна многопоточность как слабое место.

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

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

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

cab ★★★★
()
Ответ на: комментарий от Virtuos86

быть клеем для нативного кода, библиотек, написанных на Си

Для этого в нём слишком неудобный FFI. Уж лучше C++. В питоне для каждой библиотеки приходится слой совместимости писать.

Если за скобки вынести скорость, то лучше использовать Ruby. Гибче, красивее.

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

Это перестаёт быть забавным. С тем же успехом можно разговаривать с деревом. Зачем ты вообще просил критерии, если ты отказываешься попробовать их применить?

Бритва работает в любом случае. Ты просил бинарный ответ при оценке является ли проблема фундаментальной, бритва призвана дать тебе этот ответ, а не запруфать мою позицию по каждому вопросу. На сложности асма у тебя получился ответ «нет», у меня «да». Если у нас разошелся ответ по асму, значит бритва не работает? Это бред. Опять же, я уже описал сценарий по которому ты идёшь.

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

Как тебе уже несколько раз указали в этом треде, на асме можно решать те же задачи, что и на сишечке

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

аргументация почему это нужно делать критики не выдерживает

У меня не было никакой аргументации кроме растущей энтропии. Это факт, с этим не поспоришь. Достаточно ли этого чтобы не порождать очередной велосипед, решать автору потенциального велосипеда. Главное чтобы он это вообще учитывал. И тут ты со мной уже соглашался.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от cab

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

После того, как его наворотили тут еще большой вопрос имеет ли он смысл в этом амплуа.

Что наворотили-то? Для уже написанных библиотек и биндингов, которые продолжают развивать, смысл использовать питон никуда не делся.

Virtuos86 ★★★★★
()
Ответ на: комментарий от monk

быть клеем для нативного кода, библиотек, написанных на Си

Для этого в нём слишком неудобный FFI. Уж лучше C++. В питоне для каждой библиотеки приходится слой совместимости писать.

Ты предлагаешь использовать C++ как клей для библиотек на Си? Даже не знаю, что ответить.

Если за скобки вынести скорость, то лучше использовать Ruby. Гибче, красивее.

Возможно. Руби красивее на бумаге, но в реальности это оказалось значимо только для рубистов.

Virtuos86 ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Зачем ты вообще просил критерии, если ты отказываешься попробовать их применить?

С чего ты взял? Я честно применяю твой критерий, вот только результат у меня получается отличным от твоего.

Если у нас разошелся ответ по асму, значит бритва не работает?

Именно. Это значит, что твоя «бритва» не является объективным критерием, а поэтому бесполезна для дискуссии.

Ты другие проблемные языки кроме ассемблера и жавы знаешь?

Я всё время говорю про жабу только потому, что ты где-то выше по треду ты высказался весьма категорично:

Если оно решает какие-то фундаметальные проблемы, то да, а компилируемое под явамашину и в джаваскрипт — ничего не решает.

Если ты готов признать, что кто-нибудь из скалы, кложи, котлина или какой-нибудь компилируемый в js язычок таки решает проблемы разработчика (даже если ты не хочешь называть их «фундаментальными»), позволяя ему быстрее, удобнее и эффективнее решать задачи, то предлагаю на этом согласиться и сворачивать дискуссию. Я, со своей стороны, готов признать, что кложа, скала, котлин, кофескрипт, жаба, си, js, хаскелл, лисп, и так далее принципиально не нужны, всё это можно делать и на асме. А то и правда уже надоело.

У меня не было никакой аргументации кроме растущей энтропии.

Вот и хорошо. А у меня нет никакой аргументации, кроме эффективности труда программиста.

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