LINUX.ORG.RU

Racket


1

1

В последнее время играюсь к clojure, на этой волне посмотрел, что такое сабж. Понравилось. Вопрос - что вы думаете об этом ЯП? Какие у него перспективы в плане использования для высокоуровневой разработки компилируемых в нативный код программ? Т.е. производительность, удобство разработки, инфраструктура, количество библиотек, графических тулкитов и т.д.? В какой области у него наибольшие преимущества?

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

он там такой же встроенный, как и компилятор C# встроенн в фреймворк.

Ах, так вот о чем речь! Ну да - в сабже рантайм находится не в самом бинарнике, а в отдельной дллке. Это что-то существенно меняет?

И вообще, в схемах отделение рантайма и времени трансляции всегда было, и есть, очень строгое.

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

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

И разделить их никакой возможности нет.

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

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

Это в CL компиляция и есть время исполнения. И поэтому там REPL полноценный.

А в схемах repl это просто один большой toplevel.

Нет, разница не только в том что «в отдельной dll'ке»(LW/ACL тоже могут в отдельную DLL-ку пихать).

Разница в том, что это компилятор файлов и модулей. Отдельная сторонняя сущность, а не часть рантайма лисп-системы.
Вообще в контексте схем - никакой лисп-системы нет. Есть «программы». Как в контексте Си и прочих «традиционных» «компилируемых» языков.

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

Это в CL компиляция и есть время исполнения.

В racket тоже. Следовательно - в racket repl тоже полноценный. Так?

А в схемах repl это просто один большой toplevel.

что здесь подразумевается под «одним большим топ-левелом»?

Разница в том, что это компилятор файлов и модулей.

Нет, это не компилятор файлов и модулей. Это такой же eval/compile, как в CL.

Отдельная сторонняя сущность, а не часть рантайма лисп-системы.

Нет, это не отдельная сущность. Это обычные ф-и (eval/compile) обычного лисповго рантайма. То есть - часть рантайма, да.

Вообще в контексте схем - никакой лисп-системы нет.

В схемах, конечно, все по-разному. Если говорить о racket - то там есть лисп-система и любая программа выполняется в ходе работы этой лисп-системы. Запуска модуля = запуск лисп-системы, загрузка файла с модулем, исполнение модуля, завершение работы лисп-системы.

Есть «программы».

Нет, есть лисп-система и ее состояние.

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

1) В racket нет compile-file

2) Ты не понял.
foo мы не загружаем, а компилируем(причем компилируем при загрузке bar, при вызове compile-file, а не откуда-то еще какими-то сторонними методами). А bar загружаем.
Таким образом, рантайм и compile-time неотделимы.
У тебя все в compile-time происходит.

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

1) В racket нет compile-file

Ну да, впрямую нет, но есть with-open-file и read, который вернет sexpr, и есть compile, который, будучи применен к этому sexpr'у, вернет байткод формы.

2) Ты не понял.

Нет, это ты несколько не понял. В твоем представлении у нас буд-то бы есть две разных лисп-машины, одна из которых работает пока мы компилируем, а вторая - когда запускаем программу. Так это не так. Лисп-машина одна и состояние одно, ну для того чтобы тебе было понятно - вот как в CL для символа есть слоты значения, ф-и, класса, етц. и все эти слоты существуют одновременно, в одном рантайме, так и здесь есть для каждого символа набор слотов - по слоту на каждую фазу, и все эти слоты существуют в рамках одного рантайма, единомоментно. И вся информация, что была получена во время компиляции - она никуда не проебывается, она и во время рантайма остается, потому что это одна лисп-машина и одно состояние. Вот тебе пример по-лучше: [code]

(module m racket

(define-namespace-anchor nsa) (define ns (namespace-anchor->namespace nsa)) (begin-for-syntax (define x 5) (displayln 'phase1)) (displayln 'phase0) (eval '(begin-for-syntax (display x)) ns)) phase1

(require 'm)

phase1 phase0 5


[/code] eval выполняется в рантайме, то есть когда модуль уже скомпилирован и обратиться к состоянию компайл-тайма нам ничего не помешало. А можно и так: [code] #lang racket

(define-namespace-anchor nsa) (define ns (namespace-anchor->namespace nsa))

(define-syntax (get stx) (syntax-case stx () [(_ id) #`#,(eval #'id)]))

(define-syntax (set!! stx) (syntax-case stx () [(_ id expr) #`#,(eval #'(set! id expr))]))

(begin-for-syntax (define x 5))

(eval '(get x) ns) (eval '(set!! x 100) ns) (eval '(get x) ns)

-> 5 100


[/code] опять же - евал выполняется в рантайме, что не мешает нам менять компайл-тайм состояние

anonymous
()
Ответ на: комментарий от anonymous
> (module m racket
    (define-namespace-anchor nsa) 
    (define ns (namespace-anchor->namespace nsa)) 
    
    (begin-for-syntax 
      (define x 5) 
      (displayln 'phase1)) 
    
    (displayln 'phase0) 
    (eval '(begin-for-syntax (display x)) ns))
phase1
> (require 'm)
phase1
phase0
5
> 

и

#lang racket

(define-namespace-anchor nsa)
(define ns (namespace-anchor->namespace nsa))

(define-syntax (get stx)
  (syntax-case stx ()
    [(_ id) #`#,(eval #'id)]))

(define-syntax (set!! stx)
  (syntax-case stx ()
    [(_ id expr) #`#,(eval #'(set! id expr))]))

(begin-for-syntax 
  (define x 5))

(eval '(get x) ns)
(eval '(set!! x 100) ns)
(eval '(get x) ns)

->
5
100
> 

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