36 lines
1.6 KiB
Plaintext
36 lines
1.6 KiB
Plaintext
;;;; 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" str))
|
|
|
|
(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-view "state\n")))
|
|
(println "wrote it")
|
|
0)
|