文档中的步骤
结构步骤(非实际执行时序)
marqdo
这一页把外联运行时当作语言能力来展示:持久内核、从 Marqdo 值显式传入状态,以及共享内核状态的 view 单元。读者不需要向 stdin 输入 JSON。
先探测解释器。结果仍然是普通 Marqdo 数据。
access(`python`, "ok")access(`python`, "version")Marqdo 值进入内核。
订单 表是普通 Marqdo 值。外联.会话设值 把它作为 JSON 复制进 Python 内核;没有 shell,也没有 stdin。
| @ | 区域 | 金额 |
|---|---|---|
| 1 | 华东 | 120 |
| 2 | 华东 | 300 |
| 3 | 华南 | 90 |
| 4 | 华南 | 140 |
| 5 | 华北 | 220 |
| 6 | 西部 | 80 |
round(sum(float(row["金额"]) for row in orders), 2)
access(`合计`, "result")低层内核会话完全由 外联 管理;表格以显式 JSON 拷贝跨过边界。
内核态是持续的。
两次求值共享同一个内核。第二次能看到第一次创建的变量。
values = [3, 4, 5]
sum(value * value for value in values)
access(`平方和`, "result")这是内核态,不是一次性进程。它由 外联 创建、查询和关闭。
view 单元共享状态。
外联.会话 从普通表格声明一个 view 会话。表名完全自由;本页用 分析内核 和 分析单元。
| @ | 名称 | 语言 |
|---|---|---|
| 1 | 分析 | python |
| 2 | 复核 | python |
| @ | 单元 | 内核 |
|---|---|---|
| 1 | 计算 | 分析 |
| 2 | 复核 | 复核 |
| 内核 | 名称 | 值 |
|---|---|---|
| 分析 | orders | `订单` |
| 复核 | orders | `订单` |
import json
import statistics
by_region = {}
for row in orders:
by_region.setdefault(row["区域"], []).append(float(row["金额"]))
summary = []
for region, values in sorted(by_region.items()):
mean = statistics.mean(values)
sd = statistics.pstdev(values) or 1.0
summary.append({
"region": region,
"orders": len(values),
"total": round(sum(values), 2),
"mean": round(mean, 2),
"z_span": round((max(values) - mean) / sd, 3),
})
print(json.dumps({
"regions": summary,
"total": round(sum(float(row["金额"]) for row in orders), 2),
"count": len(orders),
}, ensure_ascii=False))
{"regions": [{"region": "华东", "orders": 2, "total": 420.0, "mean": 210.0, "z_span": 1.0}, {"region": "华北", "orders": 1, "total": 220.0, "mean": 220.0, "z_span": 0.0}, {"region": "华南", "orders": 2, "total": 230.0, "mean": 115.0, "z_span": 1.0}, {"region": "西部", "orders": 1, "total": 80.0, "mean": 80.0, "z_span": 0.0}], "total": 950.0, "count": 6}
— 3ms
import json
print(json.dumps({
"kernel": "复核",
"count": len(orders),
"total": round(sum(float(row["金额"]) for row in orders), 2),
}, ensure_ascii=False))
{"kernel": "复核", "count": 6, "total": 950.0}
查看 消费 会话 句柄。Run All 在 分析 内核执行 计算,在 复核 内核执行 复核;静态导出走同一批单元,并把真实输出嵌入页面。
语言上的重点:
初始值 表把同一个 Marqdo 订单 值传给两个内核。内核态归 外联 管理。view 只渲染句柄和单元。run 仍然把同一份文档当程序执行。
没有单独的 notebook CLI,这个示例不依赖 stdin,也没有隐藏的语言切换。
| lang | python |
| cmd | python3 --version |
| path | /usr/bin/python3 |
| ok | True |
| version | Python 3.12.3 |
| error |
| key | value |
|---|---|
| lang | python |
| cmd | python3 --version |
| path | /usr/bin/python3 |
| ok | True |
| version | Python 3.12.3 |
| error |
| kind | foreign-session |
| kernels | List(2) |
| cells | List(2) |
| values | Map(3) |
| inputs | None |
| key | value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| kind | foreign-session | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| kernels |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cells |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| values |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inputs | None |
| # | 名称 | 语言 |
|---|---|---|
| 1 | 分析 | python |
| 2 | 复核 | python |
| # | 名称 | 语言 |
|---|---|---|
| 1 | 分析 | python |
| 2 | 复核 | python |
| # | 单元 | 内核 |
|---|---|---|
| 1 | 计算 | 分析 |
| 2 | 复核 | 复核 |
| # | 单元 | 内核 |
|---|---|---|
| 1 | 计算 | 分析 |
| 2 | 复核 | 复核 |
| 内核 | List(2) |
| 名称 | List(2) |
| 值 | List(2) |
| key | value | ||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 内核 |
| ||||||||||||||||||||||||||||||||||||||||||||||||
| 名称 |
| ||||||||||||||||||||||||||||||||||||||||||||||||
| 值 |
|
| ok | True |
| code | 0 |
| stdout | |
| stderr | |
| ms | 0 |
| lang | python |
| … | |
| key | value |
|---|---|
| ok | True |
| code | 0 |
| stdout | |
| stderr | |
| ms | 0 |
| lang | python |
| cmd | python3 |
| timed_out | False |
| truncated | False |
| result | 950 |
| result_error | |
| error | |
| script | |
| cached | False |
| alive | True |
| id | s1 |
| ok | True |
| code | 0 |
| stdout | |
| stderr | |
| ms | 0 |
| lang | python |
| … | |
| key | value |
|---|---|
| ok | True |
| code | 0 |
| stdout | |
| stderr | |
| ms | 0 |
| lang | python |
| cmd | python3 |
| timed_out | False |
| truncated | False |
| result | 50 |
| result_error | |
| error | |
| script | |
| cached | False |
| alive | True |
| id | s1 |
| # | 区域 | 金额 |
|---|---|---|
| 1 | 华东 | 120 |
| 2 | 华东 | 300 |
| 3 | 华南 | 90 |
| 4 | 华南 | 140 |
| 5 | 华北 | 220 |
| 6 | 西部 | 80 |
| # | 区域 | 金额 |
|---|---|---|
| 1 | 华东 | 120 |
| 2 | 华东 | 300 |
| 3 | 华南 | 90 |
| 4 | 华南 | 140 |
| 5 | 华北 | 220 |
| 6 | 西部 | 80 |
---
markup: occlusion
title: 外联内核 v2 — Python 分析(view 单元)
description: 内核态、Marqdo 值传入与 view 单元 —— 不依赖 stdin 的完整示例
导入:
外联: lib/外联.mq.md
---
# main
这一页把外联运行时当作语言能力来展示:持久内核、从 Marqdo 值显式传入状态,以及共享内核状态的 view 单元。读者不需要向 stdin 输入 JSON。
---
先探测解释器。结果仍然是普通 Marqdo 数据。
**python = > 外联.探测 语言="python"**
> 打印 内容=[ok](access(`python`, "ok"))
> 打印 内容=[version](access(`python`, "version"))
---
Marqdo 值进入内核。
`订单` 表是普通 Marqdo 值。`外联.会话设值` 把它作为 JSON 复制进 Python 内核;没有 shell,也没有 stdin。
`订单` =
| @ | 区域 | 金额 |
|---|------|------|
| 1 | 华东 | 120 |
| 2 | 华东 | 300 |
| 3 | 华南 | 90 |
| 4 | 华南 | 140 |
| 5 | 华北 | 220 |
| 6 | 西部 | 80 |
**内核会话 = > 外联.会话开启 语言="python"**
**> 外联.会话设值 标识=`内核会话` 名称="orders" 值=`订单`**
`合计代码` =
```python
round(sum(float(row["金额"]) for row in orders), 2)
```
**合计 = > 外联.会话求值 标识=`内核会话` 代码=`合计代码`**
> 打印 内容=[result](access(`合计`, "result"))
低层内核会话完全由 `外联` 管理;表格以显式 JSON 拷贝跨过边界。
---
内核态是持续的。
两次求值共享同一个内核。第二次能看到第一次创建的变量。
`设值代码` =
```python
values = [3, 4, 5]
```
**> 外联.会话求值 标识=`内核会话` 代码=`设值代码`**
`平方和代码` =
```python
sum(value * value for value in values)
```
**平方和 = > 外联.会话求值 标识=`内核会话` 代码=`平方和代码`**
> 打印 内容=[result](access(`平方和`, "result"))
**> 外联.会话关闭 标识=`内核会话`**
这是内核态,不是一次性进程。它由 `外联` 创建、查询和关闭。
---
view 单元共享状态。
`外联.会话` 从普通表格声明一个 view 会话。表名完全自由;本页用 `分析内核` 和 `分析单元`。
`分析内核` =
| @ | 名称 | 语言 |
|---|------|------|
| 1 | 分析 | python |
| 2 | 复核 | python |
`分析单元` =
| @ | 单元 | 内核 |
|---|------|------|
| 1 | 计算 | 分析 |
| 2 | 复核 | 复核 |
`初始值` =
| 内核 | 名称 | 值 |
|------|------|----|
| 分析 | orders | `订单` |
| 复核 | orders | `订单` |
`会话` = > 外联.会话 内核表=`分析内核` 单元表=`分析单元` 值表=`初始值`
`计算` =
```python
import json
import statistics
by_region = {}
for row in orders:
by_region.setdefault(row["区域"], []).append(float(row["金额"]))
summary = []
for region, values in sorted(by_region.items()):
mean = statistics.mean(values)
sd = statistics.pstdev(values) or 1.0
summary.append({
"region": region,
"orders": len(values),
"total": round(sum(values), 2),
"mean": round(mean, 2),
"z_span": round((max(values) - mean) / sd, 3),
})
print(json.dumps({
"regions": summary,
"total": round(sum(float(row["金额"]) for row in orders), 2),
"count": len(orders),
}, ensure_ascii=False))
```
`复核` =
```python
import json
print(json.dumps({
"kernel": "复核",
"count": len(orders),
"total": round(sum(float(row["金额"]) for row in orders), 2),
}, ensure_ascii=False))
```
`查看` 消费 `会话` 句柄。Run All 在 `分析` 内核执行 `计算`,在 `复核` 内核执行 `复核`;静态导出走同一批单元,并把真实输出嵌入页面。
语言上的重点:
`初始值` 表把同一个 Marqdo `订单` 值传给两个内核。内核态归 `外联` 管理。view 只渲染句柄和单元。`run` 仍然把同一份文档当程序执行。
没有单独的 notebook CLI,这个示例不依赖 stdin,也没有隐藏的语言切换。