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

На этот раз он утверджает что поскольку в 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
racket ? programming Чятик, как в твоем любимом говноязычке делается такая херня -> pasterack.org

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

Я попытался сделать на говноплюсах и высрал примерно вот енто -> ideone.com но чото кал какой-то.
4DA
racket tox blight programming Ох блять, наебался вдоволь с этим новым списком контактов, и он еще подглючивает — не скроллится при выборе стрелками,
вешает нахер интерфейс при ресайзе, рисует нижнюю полоску прокрутки, да и иконки походу слишком большие.
Иногда (когда?) не снимается выделение с контакта и их получается сразу два.
4DA
нинужно racket programming Родилось в одним из диалогов с дедфудом.

Позволяет юзать синтаксис как у околохацкеля чтобы задавать значения и объявлять лямбдочки.
Для полноценной костылезации надо переопределять свой 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
racket shit bnw tox blight Нашел одну херотень в ракетке.
Когда 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
Python racket compilers
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
racket programming racket 6.0 вышел:
```
* новый пакетный манагер
* базавая установка распилена на > 200 пакетов
* компилятор JIT для arm
* значительный улучшения производительности в typed/racket
* Новый профайлер для контрактов сообщает как долго проверяются контракты.
(дохера важная фича кстати)
```
blog.racket-lang.org
4DA
racket programming Узнал сегодня про макрос with-method, который я оказыется успешно перезобрел пару раз.

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

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

docs.racket-lang.org
a13
code racket BL Lisp
(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
code racket
Суровый выхлоп работы ракетовского макростеппера:
(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‎
13oz
sicp racket Lisp Делаю упражнения из SICP — все-таки синтаксис не кажется офигенно удобным, писать еще норм (спасибо, DrRacket, за посветку скобочек), а вот читать крайне тяжело. Это лечится?
qrilka
HtDP mooc racket WTF Решил тут поглядеть курс Кизалиса с громким названием Introduction to Systematic Program Design и сделанный на основе HtDP. По-моему это какой-то мрак — юнит тесты ещё куда ни шло, но когда заметная часть вещеё делается по рукописным алгоритмам для случаев где компилятор статического языка сам бы проконтролировал... Один пример того, что для ListOfStrings и ListOfNumbers надо писать 2 разных определения и вписывать туда копипаст реализации фолд в соотвествии с htdp.org это уже многого стоит. "Систематичный метод проектирования ПРОГРАММ", который заставляет проделывать заметную автоматизируемых действий вручную(!) — убивал бы!
a13
racket RTFM вот что мне не нравится в ихних доках — не указывается, с какой версии появилась та или иная фича, приходится рыться в чейнжлогах
a13
code racket
(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
code racket Lisp programming
На лоре спросили:
/можно ли написать на 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
code racket Lisp programming
настало время факториалов.
--------------------------

мемоизация на ракете.
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)))]))
ymn
sml racket Coursera Ruby Скоро на курсере начнется годный курс "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
code racket programming
Тут короче понадобилось заюзать мне 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)
asvil
racket грабли Будущим граблестроителям, чтобы не наступали на существующие: для отладки racket'а в gdb нужно "handle SIGSEGV noprint nostop"