from picamera import PiCamera
import time
camera = PiCamera()
camera.start_preview()
while(1):
try:
camera.capture("/home/pi/test.png")
except KeyboardInterrupt:
break
camera.stop_preview()
остановить его с помощью CTRL + C
build.sbt:
name := "ContinuationSandwich"
version := "0.1"
scalaVersion := "2.11.6"
autoCompilerPlugins := true
addCompilerPlugin(
"org.scala-lang.plugins" % "scala-continuations-plugin_2.11.6" % "1.0.2")
libraryDependencies +=
"org.scala-lang.plugins" %% "scala-continuations-library" % "1.0.2"
scalacOptions += "-P:continuations:enable"
CTest.scala:
import scala.util.continuations._
object CTest extends App {
case class Sandwich()
def makeSandwich = {
println("Making sandwich")
new Sandwich
}
var k1 : (Unit => Sandwich) = null
reset {
shift { k : (Unit => Sandwich) => k1 = k }
makeSandwich
}
val x = k1()
}
То, что по сути делает код выше, вызывает Функция makeSandwich (в запутанном виде). Таким образом, результатом выполнения будет просто печать «Создание бутерброда» в консоли. Тот же результат будет достигнут без продолжений:
object CTest extends App {
case class Sandwich()
def makeSandwich = {
println("Making sandwich")
new Sandwich
}
val x = makeSandwich
}
Теперь пошагово. k1 - переменная для хранения указателя на функцию, которая должна позволять «создавать сэндвич». Мы знаем это, потому что k1 объявлено так: (Unit => Sandwich)
. Однако изначально переменная не инициализирована (k1 = null
, «пока нет ингредиентов для приготовления бутерброда»). Поэтому мы пока не можем вызвать функцию, готовящую бутерброд с использованием этой переменной.
Таким образом, мы отмечаем точку выполнения, в которую мы хотим вернуться (или точку в прошлом, в которую мы хотим вернуться), используя инструкцию «reset». makeSandwich - это еще один указатель на функцию, которая позволяет создавать сэндвич. Это последнее утверждение «сброса блока», и, следовательно, оно передается «shift» (функции) в качестве аргумента (shift { k : (Unit => Sandwich)...
. Внутри shift мы присваиваем этот аргумент переменной k1 k1 = k
, таким образом, делая k1 готовым для вызова в качестве функции) После этого мы возвращаемся к точке выполнения, отмеченной сбросом. Следующим оператором является выполнение функции, на которую указывает переменная k1, которая теперь должным образом инициализирована, поэтому в конце мы вызываем makeSandwich, который выводит на экран консоль «Making sandwich». класс сэндвича, который присваивается переменной x.