;;;; The same source on both targets, which is the whole of decision 2. ;;;; ;;;; Flan has NO conditional compilation โ€” nothing in parse.ml or check.ml ;;;; reads the target โ€” so "isolate this to desktop" is not expressible here, ;;;; and a build-time refusal would therefore be unusable. A silent no-op is ;;;; worse than either, because that is how a save file disappears with nothing ;;;; said. So `barf` on the web signals a condition and the program decides, ;;;; which is the language having something Odin does not: Odin stubs its whole ;;;; file API on js/wasm to .Unsupported so that importing core:os "panics ;;;; cleanly", and a panic is not a decision. ;;;; ;;;; Built for the desktop this prints that the write worked. Built for the ;;;; browser it prints that it was refused, and says which file and why. One ;;;; source, two outcomes, no flag anywhere. (defn main [] i32 ;; Embedding needs no filesystem and no host ABI, so this line is identical ;; on both targets and is why decision 1 came first. (print (embed "assets/a.txt" string)) (handler-bind [(FileError [c] (print "refused: ") (print (.path c)) (print " reason ") (println (.reason c)) (println (= (.reason c) file-unsupported)) ;; There is no restart that means "give up and carry on" โ€” spec- ;; conditions.md ยง2 makes `error` diverging, and a handler that returns ;; normally has not answered it. Leaving is the honest way out of a ;; save that cannot happen. (exit 0))] (barf "web-files-out.txt" (bytes "state\n"))) (println "wrote it") 0)