marqdo

外联内核 v2 — Python 分析(view 单元)ok

features/19-外联视图单元.mq.md

文档

外联:lib/外联.mq.md

main

说明

这一页把外联运行时当作语言能力来展示:持久内核、从 Marqdo 值显式传入状态,以及共享内核状态的 view 单元。读者不需要向 stdin 输入 JSON。

---

先探测解释器。结果仍然是普通 Marqdo 数据。

python = > 外联.探测 语言="python"
> 打印 内容 =okaccess(`python`, "ok")
> 打印 内容 =versionaccess(`python`, "version")
---

Marqdo 值进入内核。

订单 表是普通 Marqdo 值。外联.会话设值 把它作为 JSON 复制进 Python 内核;没有 shell,也没有 stdin。

订单 =
@区域金额
1华东120
2华东300
3华南90
4华南140
5华北220
6西部80
内核会话 = > 外联.会话开启 语言="python"
> 外联.会话设值 标识=`内核会话` 名称="orders" 值=`订单`
code 合计代码 python
round(sum(float(row["金额"]) for row in orders), 2)
合计 = > 外联.会话求值 标识=`内核会话` 代码=`合计代码`
> 打印 内容 =resultaccess(`合计`, "result")

低层内核会话完全由 外联 管理;表格以显式 JSON 拷贝跨过边界。

---

内核态是持续的。

两次求值共享同一个内核。第二次能看到第一次创建的变量。

code 设值代码 python
values = [3, 4, 5]
> 外联.会话求值 标识=`内核会话` 代码=`设值代码`
code 平方和代码 python
sum(value * value for value in values)
平方和 = > 外联.会话求值 标识=`内核会话` 代码=`平方和代码`
> 打印 内容 =resultaccess(`平方和`, "result")
> 外联.会话关闭 标识=`内核会话`

这是内核态,不是一次性进程。它由 外联 创建、查询和关闭。

---

view 单元共享状态。

外联.会话 从普通表格声明一个 view 会话。表名完全自由;本页用 分析内核 和 分析单元。

分析内核 =
@名称语言
1分析python
2复核python
分析单元 =
@单元内核
1计算分析
2复核复核
初始值 =
内核名称值
分析orders`订单`
复核orders`订单`
会话 = > 外联.会话 内核表=分析内核 单元表=分析单元 值表=初始值
code 计算 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))
{"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
code 复核 python
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,也没有隐藏的语言切换。

Functions
Variables
  • description text
    内核态、Marqdo 值传入与 view 单元 —— 不依赖 stdin 的完整示例
  • markup text
    occlusion
  • python map · 6
    langpython
    cmdpython3 --version
    path/usr/bin/python3
    okTrue
    versionPython 3.12.3
    error
  • title text
    外联内核 v2 — Python 分析(view 单元)
  • 会话 map · 5
    kindforeign-session
    kernelsList(2)
    cellsList(2)
    valuesMap(3)
    inputsNone
  • 内核会话 handle
    <handle>
  • 分析内核 list · 2
    #名称语言
    1分析python
    2复核python
  • 分析单元 list · 2
    #单元内核
    1计算分析
    2复核复核
  • 初始值 map · 3
    内核List(2)
    名称List(2)
    值List(2)
  • 合计 map · 16
    okTrue
    code0
    stdout
    stderr
    ms0
    langpython
    …
  • 合计代码 code · python
    ```python round(sum(float(row["金额"]) for row in orders), 2) ```
  • 复核 code · python
    ```python import json print(json.dumps({ "kernel": "复核", "count": len(orders), "total": round(sum(float(row["金额"]) for row in orders), 2), }, ensure_ascii=False)) ```
  • 平方和 map · 16
    okTrue
    code0
    stdout
    stderr
    ms0
    langpython
    …
  • 平方和代码 code · python
    ```python sum(value * value for value in values) ```
  • 计算 code · python
    ```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)) ```
  • 订单 list · 6
    #区域金额
    1华东120
    2华东300
    3华南90
    4华南140
    5华北220
    6西部80
  • 设值代码 code · python
    ```python values = [3, 4, 5] ```
可执行知识(辅助)

运行与结果

True Python 3.12.3 950 50
完整源码
---
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,也没有隐藏的语言切换。

Variable