Jak funguje Call/CC?

Re:Jak funguje Call/CC?
« Odpověď #15 kdy: 09. 05. 2019, 15:48:47 »
Kontinuace je prostě funkce typu (A->R)->R, která “vrací” hodnotu zavoláním funkce.
Nejsem si úplně jistej, jestli je na tomhle významu všeobecná shoda (nebo jinak: jestli tohle není příliš úzký význam, někdo by mohl asi říct i "implementace").

Třeba tady http://erlang.org/doc/man/mnesia.html#select-4 se slovo "continuation" používá prostě pro nějakou (neznámou) strukturu (ne nutně funkci), která umožňuje pokračovat v činnosti kdykoli jindy - v tomhle případě pokračovat v paginaci záznamů z DB.

Důkaz, že to skutečně není funkce:
Kód: [Vybrat]
$ iex
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> :mnesia.create_schema([Node.self])
:ok
iex(2)> :mnesia.start()
:ok
iex(3)> :mnesia.create_table(:test,[])
{:atomic, :ok}
iex(4)> :mnesia.dirty_write({:test, :a, 1})
:ok
iex(5)> :mnesia.dirty_write({:test, :b, 2})
:ok
iex(6)> :mnesia.dirty_match_object({:test, :_, :_})
[{:test, :b, 2}, {:test, :a, 1}]
iex(7)> :mnesia.transaction(fn ->
...(7)>   {rec, cont} = :mnesia.select(:test, [{:_,[],[:'$_']}], 1, :read)
...(7)>   IO.puts("rec1 = #{inspect rec}")
...(7)>   IO.puts("cont1 = #{inspect cont}")
...(7)>   {rec, cont} = :mnesia.select(cont)
...(7)>   IO.puts("rec2 = #{inspect rec}")
...(7)>   IO.puts("cont2 = #{inspect cont}")
...(7)> end)
rec1 = [{:test, :a, 1}]
cont1 = {:mnesia_select, :test, {:tid, 4, #PID<0.100.0>}, :nonode@nohost, :ram_copies, {#Reference<0.3882805345.2162294785.166659>, 161, 1, #Reference<0.3882805345.2162294785.166789>, [], 0}, [], :undefined, :undefined, [{:_, [], [:"$_"]}]}
rec2 = [{:test, :b, 2}]
cont2 = {:mnesia_select, :test, {:tid, 4, #PID<0.100.0>}, :nonode@nohost, :ram_copies, {#Reference<0.3882805345.2162294785.166659>, 162, 1, #Reference<0.3882805345.2162294785.166789>, [], 0}, [], :undefined, :undefined, [{:_, [], [:"$_"]}]}
{:atomic, :ok}


Re:Jak funguje Call/CC?
« Odpověď #16 kdy: 09. 05. 2019, 15:58:50 »
...a ještě ilustrace toho, že kontinuace umožňuje se do jí reifikovaného stavu vrátit:
Kód: [Vybrat]
iex(28)> :mnesia.transaction(fn ->
...(28)>   {rec, cont1} = :mnesia.select(:test, [{:_,[],[:'$_']}], 1, :read)
...(28)>   IO.puts("rec1 = #{inspect rec}")
...(28)>   IO.puts("cont1 = #{inspect cont1}")
...(28)>   {rec, cont2} = :mnesia.select(cont1)
...(28)>   IO.puts("rec2 = #{inspect rec}")
...(28)>   IO.puts("cont2 = #{inspect cont2}")
...(28)>   {rec, cont3} = :mnesia.select(cont1)
...(28)>   IO.puts("rec3 = #{inspect rec}")
...(28)>   IO.puts("cont3 = #{inspect cont3}")
...(28)>   IO.puts("cont2 == cont3 = #{cont2 == cont3}")
...(28)> end)
rec1 = [{:test, :a, 1}]
cont1 = {:mnesia_select, :test, {:tid, 7, #PID<0.100.0>}, :nonode@nohost, :ram_copies, {#Reference<0.3882805345.2162294785.166659>, 161, 1, #Reference<0.3882805345.2162294787.167694>, [], 0}, [], :undefined, :undefined, [{:_, [], [:"$_"]}]}
rec2 = [{:test, :b, 2}]
cont2 = {:mnesia_select, :test, {:tid, 7, #PID<0.100.0>}, :nonode@nohost, :ram_copies, {#Reference<0.3882805345.2162294785.166659>, 162, 1, #Reference<0.3882805345.2162294787.167694>, [], 0}, [], :undefined, :undefined, [{:_, [], [:"$_"]}]}
rec3 = [{:test, :b, 2}]
cont3 = {:mnesia_select, :test, {:tid, 7, #PID<0.100.0>}, :nonode@nohost, :ram_copies, {#Reference<0.3882805345.2162294785.166659>, 162, 1, #Reference<0.3882805345.2162294787.167694>, [], 0}, [], :undefined, :undefined, [{:_, [], [:"$_"]}]}
cont2 == cont3 = true
Navíc protože je to procházení databáze deterministické, platí to cont2 == cont3. Pokud by to byl třeba generátor náhodných čísel v ne-pure jazyce, nemuselo by to nutně platit.

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Jak funguje Call/CC?
« Odpověď #17 kdy: 10. 05. 2019, 14:58:24 »
Třeba tady http://erlang.org/doc/man/mnesia.html#select-4 se slovo "continuation" používá prostě pro nějakou (neznámou) strukturu (ne nutně funkci), která umožňuje pokračovat v činnosti kdykoli jindy - v tomhle případě pokračovat v paginaci záznamů z DB.

to nema s kontinuaci, o ktere tu diskutujeme, nic spolecneho.

Re:Jak funguje Call/CC?
« Odpověď #18 kdy: 10. 05. 2019, 15:03:39 »
to nema s kontinuaci, o ktere tu diskutujeme, nic spolecneho.
Je to přesně to, co jsi citoval z té Wikipedie:

a continuation is an abstract representation of the control state of a computer program. A continuation reifies the program control state, i.e. the continuation is a data structure that represents the computational process at a given point in the process's execution

https://en.wikipedia.org/wiki/Continuation

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Jak funguje Call/CC?
« Odpověď #19 kdy: 10. 05. 2019, 15:11:02 »
to nema s kontinuaci, o ktere tu diskutujeme, nic spolecneho.
Je to přesně to, co jsi citoval z té Wikipedie:

a continuation is an abstract representation of the control state of a computer program. A continuation reifies the program control state, i.e. the continuation is a data structure that represents the computational process at a given point in the process's execution

https://en.wikipedia.org/wiki/Continuation

to neni, nepamatuje si stav programu a neumoznuje se vratit zpet na misto sveho vytvoreni. Cemu ty rikas kontinuace, je databazovy kurzor.


Re:Jak funguje Call/CC?
« Odpověď #20 kdy: 10. 05. 2019, 15:12:09 »
to neni, nepamatuje si stav programu a neumoznuje se vratit zpet na misto sveho vytvoreni.
Jak myslíš, nemám potřebu se hádat.

Cemu ty rikas kontinuace, je databazovy kurzor.
Neříkám tomu tak já, ale autoři Erlangu.

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Jak funguje Call/CC?
« Odpověď #21 kdy: 11. 05. 2019, 11:54:36 »
Cemu ty rikas kontinuace, je databazovy kurzor.
Neříkám tomu tak já, ale autoři Erlangu.

je to homonymum. S tématem diskuze nemá nic společného. Erlang call/cc neumí.

Re:Jak funguje Call/CC?
« Odpověď #22 kdy: 11. 05. 2019, 11:56:11 »
Erlang call/cc neumí.
To jsem ani netvrdil.