Продолжения в Clojure

Используйте random.choice()

import random

foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))

Для криптографически безопасного случайного выбора (например, для генерации пароля от списка слов), используйте random.SystemRandom класс

import random

foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

или secrets.choice()

import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))

28
задан ntalbs 18 August 2015 в 07:32
поделиться

5 ответов

When talking about continuations, you’ll have to distinguish between two different kinds of them:

  • First-class continuations – Continuation-support that is deeply integrated in the language (Scheme or Ruby). Clojure does not support first-class continuations.

  • Continuation-passing-style (CPS) – CPS is just a style of coding and any language supporting anonymous functions will allow this style (which applies to Clojure too).

Examples:

-- Standard function
double :: Int -> Int
double x = 2 * x

-- CPS-function – We pass the continuation explicitly
doubleCPS :: Int -> (Int -> res) -> res
doubleCPS x cont = cont (2 * x)
; Call
print (double 2)

; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)

Read continuation on Wikipedia.

I don’t think that continuations are necessary for a good language, but especially first-class continuations and CPS in functional languages like Haskell can be quite useful (intelligent backtracking example).

27
ответ дан 28 November 2019 в 02:30
поделиться

Является ли продолжение необходимой функцией языка?

Нет. Во многих языках нет продолжений.

Если нет, разве вам не нужны продолжения? Я видел много хороших примеров, особенно от этого парня. Какая альтернатива?

Стек вызовов

13
ответ дан 28 November 2019 в 02:30
поделиться

Я написал порт cl-cont для Clojure, который добавляет продолжения в Common Lisp.

https: // github.com/swannodette/delimc[1289 visible

22
ответ дан 28 November 2019 в 02:30
поделиться

Обычное использование продолжений заключается в реализации структур управления для: возврата из функции, выхода из цикла, обработки исключений и т. д. Большинство языков (например, Java, C ++ и т. д.) предоставляют эти функции как часть основного языка. Некоторые языки этого не делают (например: Схема). Вместо этого эти языки представляют продолжения как объекты первого класса и позволяют программисту определять новые управляющие структуры. Таким образом, Scheme следует рассматривать как инструментарий языка программирования, а не как законченный язык сам по себе.

В Clojure нам почти никогда не нужно использовать продолжения напрямую, потому что почти все управляющие структуры обеспечиваются комбинацией языка и виртуальной машины. Все еще, Первоклассные продолжения могут стать мощным инструментом в руках компетентного программиста. Продолжения, особенно в Scheme, лучше, чем эквивалентные аналоги на других языках (например, пара setjmp / longjmp в C). Эта статья содержит более подробную информацию об этом.

Кстати, будет интересно узнать, как Рич Хикки оправдывает свое мнение о продолжениях. Есть ссылки для этого?

7
ответ дан 28 November 2019 в 02:30
поделиться

Clojure (или, скорее, clojure.contrib.monads ) имеет монаду продолжения; вот статья, описывающая его использование и мотивацию .

6
ответ дан 28 November 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: