LINUX.ORG.RU

Racket 8.0

 , ,

Racket 8.0

0

5

Вышла новая мажорная версия языка программирования Racket, основанного на Scheme и нацеленного на создание пользователем собственных DSL.

  • Завершён переход на среду исполнения Chez Scheme — таким образом удалось уменьшить объём генерируемого кода на величину от 10 до 30%, а также значительно ускорить выполнение программ и повысить эффективность.
  • Переписан движок среды тестирования программ.

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

★★★★

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

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

hlist :: [Dynamic]

Вот-вот. Получаем ту же динамику, но с синтаксическими костылями toDyn/fromDynamic.

Не говоря уж о том, что в Typed Racket я могу запихнуть, например, foldl, а потом вытащить обратно и применить к любым подходящим аргументам, а в Dynamic надо указать конкретные типы аргументов и результатов foldl в момент упаковки, а не в момент вызова fromDynamic.

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

Зачем мне срэкет на Чудском озере, когда есть Динамик

Murda Thang Pt. 2

fromDynamic :: forall a. Typeable a => Dynamic -> Maybe a
fromDynamic (Dynamic b) = if typeOf (undefined :: a) == typeOf b then Just (unsafeCoerce# b) else Nothing

fromDynamic' :: forall a cxt. (Typeable a) => Dynamic cxt -> Maybe (Dict (cxt a), a)
fromDynamic' (Dynamic (it :: t)) = 
    case eqDict :: Maybe (Dict (t ~ a)) of
        Just Dict   -> Just (Dict, it)
        Nothing     -> Nothing

weakenDyn :: forall c d. (c :<: d) => Dynamic c -> Dynamic d
weakenDyn (Dynamic (it :: t)) = case weaken1 (Dict :: Dict (c t)) of
    (Dict :: Dict (d t)) -> Dynamic it
anonymous
()
Ответ на: комментарий от anonymous

Я же написал: Dynamic плохо хранит функции.

Вот пример:

(define l (list + - *))
(map (lambda (op) 
       (list (op 3 5) (op 4.5 2.3)))
     l)

Пробуем сделать такое на Dynamic и видим, что операции (+) (-) (*) в список не сохраняются даже внутри Dynamic. Потому что полиморфные.

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

Элементарный топос, капишь?

class Uninhabited o where
  explosion :: o -> Void

quodlibet :: Uninhabited o => o -> a
quodlibet = absurd . explosion
anonymous
()
Ответ на: комментарий от monk

Развил ваш код под свои нужды. В файле students.txt просто столбец из фамилий. Номер линии в файле содержит фамилию. Студентам, с номерами 1,4,7... дается файл s1, с номермами 2,5,8... файл s2 и с номерами 3,6.9,,, файл s3. Но как то остался нудовлетворен сотворенным. Мне казалось разумнее пройтись по файлу students.txt, начиная с 1 и с шагом три, используя файл s1; затем начиная с 2 и шагом три используя файл s2 и т.д. Но не смог найти как задать шаг в for. Как бы вы сделали с вашим опытом? Нет ли форума где можно задавать конуретные вопросу по racket/scheme?

(current-directory "/path/to/directory/")
(let ([ii 1] [kk 3])
  (call-with-input-file "students.txt" 
  (λ (in)
     (for/last ([line (in-lines in)]) (display ii)  
       (if (integer? (/ (- ii 1) kk))
         (copy-file "s1.pdf" (string-append line ".pdf") #t)
         (if (integer? (/ (- ii 2) kk))
           (copy-file "s2.pdf" (string-append line ".pdf") #t)
           (if (integer? (/ (- ii 3) kk))
             (copy-file "s3.pdf" (string-append line ".pdf") #t) (display 'ok)))) (set! ii (+ ii 1))))))

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

Но как то остался нудовлетворен сотворенным.

Если есть set!, то почти наверняка что-то сделано неправильно. И если есть нетривиальные строчки, которые хочется копировать/вставить, значит они должны быть функцией.

И for/last нужен, если тебе нужно последнее значение. Если не нужно, лучше просто for.

(current-directory "/path/to/directory/")
(call-with-input-file "students.txt" 
  (λ (in)
     (for ([line (in-lines in)]
           [ii (in-naturals 1)) 
       (display ii)
       (define (pos? n) (integer? (/ (- ii n) 3))
       (define (copy s)
         (copy-file s (string-append line ".pdf") #t))
       (cond
         [(pos? 1) (copy "s1.pdf)]
         [(pos? 2) (copy "s2.pdf)]
         [(pos? 3) (copy "s3.pdf)]
         [else (display 'ok)]))))

Более естественно остаток сравнивать через

(define (pos? n) (= (remainder ii 3) n))

Если же считать, что display отладочные и не нужны, тогда будет

(current-directory "/path/to/directory/")
(call-with-input-file "students.txt" 
  (λ (in)
     (for ([line (in-lines in)]
           [ii (in-cycle (in-range 1 4))])
       (copy-file (format "s~a.pdf" ii) 
                  (string-append line ".pdf") #t))))

Мне казалось разумнее пройтись по файлу students.txt, начиная с 1 и с шагом три, используя файл s1; затем начиная с 2 и шагом три используя файл s2 и т.д.

Три раза читать файл не очень разумно.

Но не смог найти как задать шаг в for.

Можно так:

(for ([line (in-lines in)]
      [ii (in-cycle (in-range 3))]
      #:when (= ii 0))
  ...)

Будет первый, четвёртый, седьмой, …

(for ([line (in-lines in)]
      [ii (in-cycle (in-range 3))]
      #:when (= ii 1))
  ...)

Будет второй, пятый, восьмой, …

Нет ли форума где можно задавать конуретные вопросу по racket/scheme?

https://groups.google.com/g/racket-users

Но там по-английски и предполагается, что основы уже знаешь. Можешь задавать вопросы мне в почту kalimehtar@mail.ru.

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

Спасибо большое. Чувствуется опыт :). Код намного изящнее и короче. Я как то внутренне чувствовал, что копи-паст для каждой новой ситуации не разумен. Вот вы и подтвердили

Если есть set!, то почти наверняка что-то сделано неправильно. И если есть нетривиальные строчки, которые хочется копировать/вставить, значит они должны быть функцией.

Спасибо за помощь, с вопросами буду обращаться на вашу почту. Тут «не место для дискуссий» вне топика :)

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