fonsp / Pluto.jl

🎈 Simple reactive notebooks for Julia
https://plutojl.org/
MIT License
4.94k stars 285 forks source link

Reactivity breaks with a simple function definition #826

Closed yurivish closed 3 years ago

yurivish commented 3 years ago

Creating the following three cells in order illustrates the issue:

image

Once bc is defined, the test cell continues to say that bc is undefined.

What seems to be happening is that

bc(f) = (args...) -> f.(args...)

is not able to be be parsed by Pluto's expression parser.

Here is the full error and stack trace:


┌ Error: Unknown lambda type
└ @ Pluto.ExpressionExplorer ~/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:513
┌ Error: Expression explorer failed on:
│   ex =
│    :($(Expr(:toplevel, :(#= /Users/yurivish/.julia/pluto_notebooks/Exciting notebook.jl#==#15f27de0-504d-11eb-12b5-a93ae8f96c01:1 =#), :(bc(f) = begin
│              #= /Users/yurivish/.julia/pluto_notebooks/Exciting notebook.jl#==#15f27de0-504d-11eb-12b5-a93ae8f96c01:1 =#
│              args...->begin
│                      #= /Users/yurivish/.julia/pluto_notebooks/Exciting notebook.jl#==#15f27de0-504d-11eb-12b5-a93ae8f96c01:1 =#
│                      f.(args...)
│                  end
│          end))))
└ @ Pluto.ExpressionExplorer ~/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:888
MethodError: no method matching iterate(::Nothing)
Closest candidates are:
  iterate(::Pkg.Resolve.NodePerm, ::Any...) at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/Pkg/src/Resolve/maxsum.jl:228
  iterate(::Test.GenericString) at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/Test/src/Test.jl:1589
  iterate(::Test.GenericString, ::Integer) at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/Test/src/Test.jl:1589
  ...
Stacktrace:
 [1] explore!(::Expr, ::Pluto.ExpressionExplorer.ScopeState) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:516
 [2] (::Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState})(::Expr) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:649
 [3] MappingRF at ./reduce.jl:93 [inlined]
 [4] _foldl_impl(::Base.MappingRF{Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState},Base.BottomRF{typeof(union!)}}, ::Pluto.ExpressionExplorer.SymbolsState, ::Array{Any,1}) at ./reduce.jl:62
 [5] foldl_impl at ./reduce.jl:48 [inlined]
 [6] mapfoldl_impl(::Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState}, ::typeof(union!), ::NamedTuple{(:init,),Tuple{Pluto.ExpressionExplorer.SymbolsState}}, ::Array{Any,1}) at ./reduce.jl:44
 [7] mapfoldl(::Function, ::Function, ::Array{Any,1}; kw::Base.Iterators.Pairs{Symbol,Pluto.ExpressionExplorer.SymbolsState,Tuple{Symbol},NamedTuple{(:init,),Tuple{Pluto.ExpressionExplorer.SymbolsState}}}) at ./reduce.jl:160
 [8] explore!(::Expr, ::Pluto.ExpressionExplorer.ScopeState) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:649
 [9] (::Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState})(::Expr) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:649
 [10] MappingRF at ./reduce.jl:93 [inlined]
 [11] _foldl_impl(::Base.MappingRF{Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState},Base.BottomRF{typeof(union!)}}, ::Pluto.ExpressionExplorer.SymbolsState, ::Array{Any,1}) at ./reduce.jl:58
 [12] foldl_impl at ./reduce.jl:48 [inlined]
 [13] mapfoldl_impl(::Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState}, ::typeof(union!), ::NamedTuple{(:init,),Tuple{Pluto.ExpressionExplorer.SymbolsState}}, ::Array{Any,1}) at ./reduce.jl:44
 [14] mapfoldl(::Function, ::Function, ::Array{Any,1}; kw::Base.Iterators.Pairs{Symbol,Pluto.ExpressionExplorer.SymbolsState,Tuple{Symbol},NamedTuple{(:init,),Tuple{Pluto.ExpressionExplorer.SymbolsState}}}) at ./reduce.jl:160
 [15] explore!(::Expr, ::Pluto.ExpressionExplorer.ScopeState) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:649
 [16] explore!(::Expr, ::Pluto.ExpressionExplorer.ScopeState) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:453
 [17] explore!(::Expr, ::Pluto.ExpressionExplorer.ScopeState) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:302
 [18] (::Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState})(::Expr) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:649
 [19] MappingRF at ./reduce.jl:93 [inlined]
 [20] _foldl_impl(::Base.MappingRF{Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState},Base.BottomRF{typeof(union!)}}, ::Pluto.ExpressionExplorer.SymbolsState, ::Array{Any,1}) at ./reduce.jl:62
 [21] foldl_impl at ./reduce.jl:48 [inlined]
 [22] mapfoldl_impl(::Pluto.ExpressionExplorer.var"#32#39"{Pluto.ExpressionExplorer.ScopeState}, ::typeof(union!), ::NamedTuple{(:init,),Tuple{Pluto.ExpressionExplorer.SymbolsState}}, ::Array{Any,1}) at ./reduce.jl:44
 [23] mapfoldl(::Function, ::Function, ::Array{Any,1}; kw::Base.Iterators.Pairs{Symbol,Pluto.ExpressionExplorer.SymbolsState,Tuple{Symbol},NamedTuple{(:init,),Tuple{Pluto.ExpressionExplorer.SymbolsState}}}) at ./reduce.jl:160
 [24] explore!(::Expr, ::Pluto.ExpressionExplorer.ScopeState) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:649
 [25] compute_symbolreferences(::Expr) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:870
 [26] try_compute_symbolreferences(::Expr) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/analysis/ExpressionExplorer.jl:886
 [27] |> at ./operators.jl:834 [inlined]
 [28] #66 at ./none:0 [inlined]
 [29] iterate at ./generator.jl:47 [inlined]
 [30] Dict{Pluto.Cell,Pluto.ReactiveNode}(::Base.Generator{Array{Pluto.Cell,1},Pluto.var"#66#67"}) at ./dict.jl:102
 [31] dict_with_eltype at ./abstractdict.jl:531 [inlined]
 [32] dict_with_eltype at ./abstractdict.jl:538 [inlined]
 [33] Dict(::Base.Generator{Array{Pluto.Cell,1},Pluto.var"#66#67"}) at ./dict.jl:128
 [34] updated_topology at /Users/yurivish/.julia/packages/Pluto/luIaC/src/evaluation/Update.jl:20 [inlined]
 [35] update_save_run!(::Pluto.ServerSession, ::Pluto.Notebook, ::Array{Pluto.Cell,1}; save::Bool, run_async::Bool, prerender_text::Bool, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/evaluation/Run.jl:129
 [36] (::Pluto.var"#147#149")(::Pluto.ServerSession, ::Dict{Any,Any}, ::Pluto.Notebook, ::Pluto.Cell; initiator::Pluto.Initiator) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/webserver/Dynamic.jl:94
 [37] process_ws_message(::Pluto.ServerSession, ::Dict{Any,Any}, ::HTTP.WebSockets.WebSocket{HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/webserver/WebServer.jl:357
 [38] (::Pluto.var"#215#225"{Pluto.ServerSession,Base.RefValue{Function}})(::HTTP.WebSockets.WebSocket{HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/webserver/WebServer.jl:160
 [39] upgrade(::Pluto.var"#215#225"{Pluto.ServerSession,Base.RefValue{Function}}, ::HTTP.Streams.Stream{HTTP.Messages.Request,HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}; binary::Bool) at /Users/yurivish/.julia/packages/HTTP/IAI92/src/WebSockets.jl:160
 [40] upgrade at /Users/yurivish/.julia/packages/HTTP/IAI92/src/WebSockets.jl:142 [inlined]
 [41] (::Pluto.var"#214#224"{Pluto.ServerSession,HTTP.Handlers.Router{Symbol("##253")},Base.RefValue{Function}})(::HTTP.Streams.Stream{HTTP.Messages.Request,HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) at /Users/yurivish/.julia/packages/Pluto/luIaC/src/webserver/WebServer.jl:147
 [42] handle at /Users/yurivish/.julia/packages/HTTP/IAI92/src/Handlers.jl:269 [inlined]
 [43] #4 at /Users/yurivish/.julia/packages/HTTP/IAI92/src/Handlers.jl:345 [inlined]
 [44] macro expansion at /Users/yurivish/.julia/packages/HTTP/IAI92/src/Servers.jl:367 [inlined]
 [45] (::HTTP.Servers.var"#13#14"{HTTP.Handlers.var"#4#5"{HTTP.Handlers.StreamHandlerFunction{Pluto.var"#214#224"{Pluto.ServerSession,HTTP.Handlers.Router{Symbol("##253")},Base.RefValue{Function}}}},HTTP.ConnectionPool.Transaction{Sockets.TCPSocket},HTTP.Streams.Stream{HTTP.Messages.Request,HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() at ./task.jl:356

The Pluto version is Pluto v0.12.18 and the Julia version is:

julia> versioninfo()
Julia Version 1.5.3
Commit 788b2c77c1 (2020-11-09 13:37 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin18.7.0)
  CPU: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-9.0.1 (ORCJIT, skylake)
fonsp commented 3 years ago

I wrote a test, this one should pass after the fix:

https://github.com/fonsp/Pluto.jl/blob/df353bf53871a00fd09481e773fe0f9ca5b96d57/test/ExpressionExplorer.jl#L219-L224

Instructions are at the top of that file.