Pull to refresh

10 «однострочников» на Racket, которые произведут впечатление на ваших друзей

Reading time2 min
Views8.9K
Хочу вернуться к подзабытой теме о «10 однострочниках» на любимом языке. Бурное обсуждение на Хабре было несколько месяцев назад. К сожалению, не многие приводили действительно однострочники и не многие из них были читабельны. Хочу предложить версию на Racket, которая по этим параметрам местами даже превосходит изначальный пример на Scala.


1. Удваиваем каждый элемент списка

Можно делать так:
(for/list ((i (in-range 10))) (* 2 i))

Либо так:
(map (curry * 2) (build-list 10 (λ (x) x)))


2. Суммируем все числа в списке

(apply + (build-list 10000 (λ (x) x)))


3. Проверяем вхождение подстроки

(define wordlist '("Racket" "akka" "play framework" "sbt" "curring")) ; искомые строки
(define tweet "This is an example tweet talking about Racket and curring") ; проверяемая строка

Находит первое вхождение (если не находит, возвращает #f):
(findf (curryr regexp-match? tweet) wordlist)

Выбирает из wordlist подстроки, присутствующие в tweet:
(filter (curryr regexp-match? tweet) wordlist)


4. Чтение из файла

(file->string "file.txt") ; в одну строку
(file->lines "file.txt") ; в список строк


5. Печать песни «Happy Birthday»


Раз вариант
(for-each (λ (x) (display (string-append "Happy Birthday" (if x ", dear John" " to You") "\n"))) '(#f #f #t #f))

Два вариант
(for ((x (in-range 4))) (display (string-append "Happy Birthday" (if (= x 2) ", dear John" " to You") "\n")))

Три вариант
(display-lines (build-list 4 (λ (x) (string-append "Happy Birthday" (if (= x 2) ", dear John" " to You")))))


6. Фильтрация списка чисел

(partition (curry > 60) '(49 58 76 82 88 90))

Возвращает два списка — отвечающий условию и не отвечающий.

7. Получение и разбор XML от веб-сервиса

Загружаем стандартные библиотеки:
(require net/url xml)

Следующее действие помещает полученный xml в структуру типа document
(define doc (read-xml (get-pure-port (string->url "http://search.twitter.com/search.atom?&q=racket"))))

При желании, можно распарсить полученный документ в дерево — родной формат лиспа, коим Racket и является:
(xml->xexpr (document-element doc))


8. Поиск минимума (или максимума) в списке

Не сложнее, чем сложение чисел:
(apply max '(14 35 -7 46 98))
(apply min '(14 35 -7 46 98))


9. Параллельная обработка

Пусть есть какие-то данные. В качестве теста приведём обычный список:
(define data-list '(A B C D E F G H))

И есть какая-то процедура. Для наглядности выберем многократную печать символа:
(define (process sym) (for ((n (in-range 10))) (display sym)))

Запускается параллельная обработка так:
(for ((x data-list)) (thread (λ () (process x))))


10. Решето Эратосфена

Задача скорее алгоритмическая. Есть множество способов её решения.
Вот генерация списка чисел от 2 до max
(define (eratosphen max)
  (let er ([lst null] [cur 2])
    (cond
      [(> cur max) (reverse lst)]
      [(ormap (λ (x) (= (remainder cur x) 0)) lst)
       (er lst (add1 cur))]
      [else (er (cons cur lst) (add1 cur))])))

Это в одну строчку записывать не стоит.
А если нужна только проверка числа на простоту методом решета Эратосфена, то код и правда может уместиться в строку (на месте 113 должно стоять проверяемое число).
(let check ([cur 2] [n 113]) (cond [(= (remainder n cur) 0) #f] [(> (sqr cur) n) #t] [else (check (add1 cur) n)]))

Но я бы такое всё же разбивал «на лесенки», как и все остальные решения этой задачи.
Tags:
Hubs:
+10
Comments38

Articles