@@ -185,3 +185,71 @@ Use `Pretty.valueToString` for a readable string form.
185185Each error contains:
186186- ` Message `
187187- ` Span ` (` Line ` /` Column ` information)
188+
189+ ## Embedding cookbook
190+
191+ ### 1. Parse/eval a file with ` #include `
192+ Use include-aware parsing when executing scripts from disk.
193+
194+ ``` fsharp
195+ open FScript.Language
196+
197+ let root = "/path/to/workspace"
198+ let entry = "/path/to/workspace/main.fss"
199+
200+ let program = FScript.parseFileWithIncludes root entry
201+ let typed = FScript.infer program
202+ let value = FScript.eval typed
203+ ```
204+
205+ ### 2. Load once, invoke many times
206+ Use ` ScriptHost ` when you want to invoke exported functions repeatedly.
207+
208+ ``` fsharp
209+ open FScript.Language
210+ open FScript.Runtime
211+
212+ let hostContext = { RootDirectory = "." }
213+ let externs = Registry.all hostContext
214+
215+ let loaded =
216+ ScriptHost.loadFile externs "./script.fss" "."
217+
218+ let r1 = ScriptHost.invoke loaded "run" [ VString "build" ]
219+ let r2 = ScriptHost.invoke loaded "run" [ VString "test" ]
220+ ```
221+
222+ ### 3. Add one custom extern
223+ Define a typed external function and pass it to inference/evaluation.
224+
225+ ``` fsharp
226+ open FScript.Language
227+
228+ let envExtern =
229+ { Name = "Env.get"
230+ Scheme = Forall([], TFun(TString, TOption TString))
231+ Arity = 1
232+ Impl =
233+ function
234+ | [ VString key ] ->
235+ System.Environment.GetEnvironmentVariable(key)
236+ |> Option.ofObj
237+ |> VOption
238+ | _ ->
239+ raise (EvalException { Message = "Env.get expects one string"; Span = Span.mk (Span.pos 0 0) (Span.pos 0 0) }) }
240+
241+ let src = "Env.get \"HOME\""
242+ let program = FScript.parse src
243+ let typed = FScript.inferWithExterns [ envExtern ] program
244+ let value = FScript.evalWithExterns [ envExtern ] typed
245+ ```
246+
247+ ### 4. Export descriptor discovery
248+ After inference, get function descriptors to expose callable surface in hosts.
249+
250+ ``` fsharp
251+ open FScript.Language
252+
253+ let typed = "[<export>] let run x = x" |> FScript.parse |> FScript.infer
254+ let descriptors = Descriptor.describeFunctions typed Map.empty
255+ ```
0 commit comments