Чтобы добавлять сообщения и комментарии, .

@4DA:
4DA

YAY, racket 6.1.1 is out.

@4DA:
4DA

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

На этот раз он утверджает что поскольку в JS apply принимает дополнительный параметр — объект, this которого будет активным во время функции, которую вызывает apply, то это является более мощной АБОСРАКЦИЕЙ.

Хуйта канеш. От нечего делать накидал подобную херню в схемке. ths лексически биндится на передаваемый объект в теле функции.

```
#lang racket
(require syntax/parse/define)
(require racket/stxparam)

(define-syntax-parameter ths
(lambda (stx) (raise-syntax-error #f "Not used inside js-apply!" stx)))

(define-simple-macro (js-apply obj:expr fn:expr args...)
(let ([this-obj obj])
(syntax-parameterize ([ths (make-rename-transformer #'this-obj)])
(apply fn args...))))


(js-apply (new (class object%
(super-new)
(init-field [x 10])))
(lambda (y) (+ y (get-field x ths)))
(list 1))

;; 11
```

@4DA:
4DA

говно
Typed Racket’s local type inference algorithm is currently not able to infer types for polymorphic functions that are used on higher-order arguments that are themselves polymorphic.

@4DA:
4DA

tfw кто-то реализовал твою задумку быстрее тебя
youtube.com

@4DA:
4DA

Чятик, как в твоем любимом говноязычке делается такая херня -> pasterack.org

То есть нагенерить пачку классов (не объектов, так что JS-питухи сразу идут лесом), которые параметризованы лямбдочками.

Я попытался сделать на говноплюсах и высрал примерно вот енто -> ideone.com но чото кал какой-то.

@4DA:
4DA

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

@4DA:
4DA

Родилось в одним из диалогов с дедфудом.

Позволяет юзать синтаксис как у околохацкеля чтобы задавать значения и объявлять лямбдочки.
Для полноценной костылезации надо переопределять свой reader через #lang, что делать конечно лень.


```
;; gayfood.rkt
#lang racket

(require syntax/parse)
(require (for-syntax syntax/parse))
(provide (all-defined-out))

(begin-for-syntax
(define-syntax-class gaylambda
#:literals (->)
(pattern (-> (arg:id ...) body:expr))))

(define-syntax (-> stx)
(syntax-parse stx
[f:gaylambda #'(lambda (f.arg ...) f.body)]))

(define-syntax (= stx)
(syntax-parse stx
#:literals (=)
[(= a:id b:expr) #'(define a b)]))

```

```
;; test
#lang sweet-exp racket
require("gayfood.rkt")

{ closureLambda = {(i) -> {i * i}} }

printf("closureLambda(10) = ~a\n" closureLambda(10))
```

выводит 100, охуеть, правда?

@4DA:
4DA

Интервью с одним из авторов ракетки.
blog.cognitect.com

@4DA:
4DA

Нашел одну херотень в ракетке.
Когда tox присылет асинхронно сообщения, то контрол editor иногда кидает эксепшеном что мол метод insert вызван на залоченом редакторе и идите нахуй:
```
sequence-contract-violation: negative: method insert cannot be called, except in states (unlocked)
```

Такое проявляется если tox начинает срать безостановочно кучей сообщений с мелким интервалом (спасибо штилетте)

Пока навернул такой костыль, но это жуткая ебанина, буду долбиться в их список рассылки за объяснениями.
```
(call/cc
(lambda (cc)
(with-handlers ([exn:fail?
(lambda (ex)
(sleep 1)
(cc))])

(send editor insert message))))
```

@4DA:
4DA

Eduardo Costa writes:

> Is there anything in the semantic of Python that makes it much more difficult to
> implement a Python compiler than a Racket compiler?

Python is much more dynamic than Racket. As an illustration, look at a simple
operation: addition. In Racket,

(+ a b)

requires dispatching on the types of a and, from a finite (and small)
list of admitted candidates (fixnum, flonum, ...). Anything else is an error.

In Python,

a + b

is just syntactic sugar for

a.__add__(b)

which means (1) Look up the type of a, (2) look up '__add__' in the
method dictionary of that type and its supertypes, (3) if not found,
look up '__radd__' in the method dictionary of the type of b, (4) call
the resulting method. None of the intermediate lookups can be cached
because everything might be different the next time that operation is
executed: a and b can have different types, and the definition of
__add__ for the types of a and b can have changed.

Konrad.

лан.

@4DA:
4DA

i.imgur.com

няшно @ функционально
github.com

@4DA:
4DA

racket 6.0 вышел:
```
* новый пакетный манагер
* базавая установка распилена на > 200 пакетов
* компилятор JIT для arm
* значительный улучшения производительности в typed/racket
* Новый профайлер для контрактов сообщает как долго проверяются контракты.
(дохера важная фича кстати)
```
blog.racket-lang.org

@ymn:
ymn

Всем Racket 6.0, посоны! Пруф: download.racket-lang.org

@4DA:
4DA

Узнал сегодня про макрос with-method, который я оказыется успешно перезобрел пару раз.

Макрос извлекает методы ил класса и биндит их как функции на область действия.

(with-method ((id (obj-expr method-id)) ...)
body ...+)

docs.racket-lang.org

@4DA:
4DA

imgur.com

@a13:
a13

(match part
           [(list name (cons 'sub (cons partdata tail)))
            (foldl
             (curry or
                    (match x
                      [(list bla-bla (list 'enabled e)) e]
                      [_ #f])) #f tail)]
           [_ #f])

доктор, мне кажется я пейшу не на том языке >_<

@4DA:
4DA

Суровый выхлоп работы ракетовского макростеппера:
(define (g) 
  (forever (let ([abort abort]) 
             (unless #t (abort)) (abort))))))

Для тех, кому интересно: первый abort имееет контекст из раскрытия макроса `while', а второй - из раскрытия макроса `forever', этакие костыли для обхода гигены без использвания stx-params.
сорцы: http://paste.lisp.org/display/138905
соус:  barzilay.org/misc/stxparam.pdf‎

@4DA:
4DA

Считаете, что монадные трансформеры это сложно?

Попробуйте разобраться с syntax model в racket!

@4DA:
4DA

Ну короче, как обычно было нечего делать, запилил тупую генерацию выпуклой оболочки трех точек (ТРЕУГОЛЬНИК ДА)
методом выпуклых сумм векторов.

Картинко:
i.imgur.com

Сорсы:
github.com

@13oz:
13oz

Делаю упражнения из SICP — все-таки синтаксис не кажется офигенно удобным, писать еще норм (спасибо, DrRacket, за посветку скобочек), а вот читать крайне тяжело. Это лечится?

@13oz:
13oz

а к префиксной записи реально быстро привыкаешь. но для глаза инфиксная все равно удобнее

@qrilka:
qrilka

Решил тут поглядеть курс Кизалиса с громким названием Introduction to Systematic Program Design и сделанный на основе HtDP. По-моему это какой-то мрак — юнит тесты ещё куда ни шло, но когда заметная часть вещеё делается по рукописным алгоритмам для случаев где компилятор статического языка сам бы проконтролировал... Один пример того, что для ListOfStrings и ListOfNumbers надо писать 2 разных определения и вписывать туда копипаст реализации фолд в соотвествии с htdp.org это уже многого стоит. "Систематичный метод проектирования ПРОГРАММ", который заставляет проделывать заметную автоматизируемых действий вручную(!) — убивал бы!

@avenat:
avenat

Ох, эти скобочки меня просто убивают %-(

@ymn:
ymn

вот-вот стартанет новый курс на курсере — class.coursera.org

@4DA:
4DA

Fear of Macros.
Неплохой туториал по макросам.

greghendershott.com

@4DA:
4DA

Русское быдло в рассылке racket
lists.racket-lang.org

@4DA:
4DA

Хочу начать костылять интерпретатор elisp на racket.
Дальше в планах — реализация недоемакса.

Чят, отговори.

@asvil:
asvil

Скоро и на андроиде...

@a13:
a13

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

@a13:
a13

(append-map (lambda (user)
              (append-map (lambda (af) 
                            (map 
                             (lambda (single-af) 
                               (cons single-af user)) 
                             (match af
                               ((list type addrs ...) 
                                (map (lambda (x) (list type x)) addrs)))))
                          (filter (lambda (x) (member (car x) fields))
                                  (cdr user))))
            users)

что-то я делаю не так ...

@4DA:
4DA

General Parser Combinators in Racket
github.com

@4DA:
4DA

На лоре спросили:
/можно ли написать на Racket такую функцию, чтобы внутри неё (в её динамическом окружении) делений на 0 возвращало 0, а не прерывало вычисления/

Короче, да:

(define-syntax-rule (try-or-zero body ...)
  (let/cc k (with-handlers ([exn? (λ _ (k 0))]) 
	      body ...)))

(define (testl l) 
  (if (null? l)
      '()
      (cons (try-or-zero (/ 1 (car l)))
            (testl (cdr l)))))

(testl '(1 2 3 0 5))

@4DA:
4DA

настало время факториалов.
--------------------------

мемоизация на ракете.
nothing special.	   

#lang racket 
; replace define with a memoized version
(define-syntax define-memoized
  (syntax-rules ()
    [(_ (f args ...) bodies ...)
     (define f
       ; store the cache as a hash of args => result
       (let ([results (make-hash)])
         ; need to do this to capture both the names and the values
         (lambda (args ...)
           ((lambda vals
              ; if we haven't calculated it before, do so now
              (when (not (hash-has-key? results vals))
                (hash-set! results vals (begin bodies ...)))
              ; return the cached result
              (hash-ref results vals))
            args ...))))]))

; example, fibonacci with memoization
(define-memoized (mfib n)
  (cond
    [(< n 1) 1]
    [else (+ (mfib (- n 1)) (mfib (- n 2)))]))

@4DA:
4DA

Хорошая видяшка про racket с презентацией.

infoq.com

@4DA:
4DA

Короче, хотел распараллелить свой костылерейтрейсер на future-сах.

Соснул: ompldr.org
Примитив values лочит поток.

@ymn:
ymn

Скоро на курсере начнется годный курс "Programming Languages".

"This course is an introduction to the basic concepts of programming languages, with a strong emphasis on functional programming. The course uses the languages ML, Racket, and Ruby as vehicles for teaching the concepts, but the real intent is to teach enough about how any language “fits together” to make you more effective programming in any language — and in learning new ones"

class.coursera.org

@4DA:
4DA

Тут короче понадобилось заюзать мне binary heap в racket и захотел я это сделать с использованием стандартных схем итерации через for-iterations.
Однако текущая  binary heap не реализует нужный интерфейс (stream?). 

Поэтому кое-чего нужно доопределить. К счастью, в racket это сделать достаточно просто.

Необходимо задать структуру, реализующую три функции: stream-empty? stream-first и stream-rest
(тест на пустоту потока, получение элемента из головы и хвоста)

(define-struct hstream (v)
  #:methods gen:stream
  [(define (stream-empty? st)
     (eq? (heap-count (hstream-v st)) 0))
   (define (stream-first st)
     (heap-min (hstream-v st)))
   (define (stream-rest st)
     (begin (heap-remove-min! (hstream-v st))
   	    (hstream (hstream-v st))))])

простой пример:

> (define h1 (make-heap <))
> (heap-add! h1 8)
> (heap-add! h1 11)
> (heap-add! h1 2)

> (for/list ([x h1]) x)
for: expected a sequence for x, got something else: #<heap>

> (for/list ([x (hstream h1)]) x)
'(2 8 11)

@4DA:
4DA

Собрал racket-5.3.1 под текущий debian testing

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

@asvil:
asvil

Как я модифицировал Racket VM для 80битной арифметики с плавающей точкой:

youtu.be

@asvil:
asvil

Будущим граблестроителям, чтобы не наступали на существующие: для отладки racket'а в gdb нужно "handle SIGSEGV noprint nostop"