.NET程序员的多语言笔记本:Polyglot Notebook
大家好,我是Edison。
之前在学习机器学习的时候,使用了Jupyter Notebook这个笔记本工具,我就在想.NET这边有没有类似的,今天就跟你介绍下Polyglot Notebook这个工具。
Notebook是什么鬼?
Notebook是一种混合格式化文本和可执行代码,创建具有可运行示例的特殊文档程序。Notebook由多个单元格组成,它们是不同的文本区域,通常有三种区域:
- 代码单元:包含可执行的代码示例
- 输出单元格:包含上次执行关联代码单元格的结果
- Markdown单元格:用于编辑和显示文本内容,包含符合markdown格式的文本、图像、图表等
Jupyter是Notebook技术的经典代表,基本我们学习Python相关的内容如数据科学都会用到它,非常好用。

Polyglot Notebook
Polyglot Notebook是一个由Microsoft开发的交互式编程环境,它允许用户在同一个笔记本中混合使用多种编程语言,旨在提高开发者在处理复杂数据分析和机器学习任务时的效率和灵活性。
一句话总结:Polyglot Notebook = 交互式编程笔记本 + Markdown + Coding
目前,它支持混合使用以下编程语言:

我们目前可以在Visual Studio Code中通过安装这个扩展来进行安装它:

快速开始
(1)准备工作
- 安装.NET SDK 以及 VS Code
- 安装Polyglot Notebook扩展插件
注意:目前Polyglot插件要求安装.NET 9 SDK才可以运行。
(2)Hello World
创建一个hello-world.dib文件(jupyter是.ipynb文件),选择C# Script内核,开始写出第一句代码,点击下图中的1号红色区域按钮即可实现代码执行输出。

你可以通过点击上图中2号红色区域,从C# 切换到另一种 编程语言,比如切换到 JavaScript:

除了添加代码示例,我们还可以添加文本内容,例如下图中的1号和2号红色区域所示。此外,点击下图中的3号红色按钮即可实现预览。

再来一个复杂一点的代码:
var displayRef = "initial value".Display();
System.Threading.Thread.Sleep(5000);
displayRef.Update("different value");
点击执行效果演示,在阻塞两秒后发生value改变:

(3)变量共享
有时候我们在编写多语言代码时,想要从上一个A语言的上下文中传递某个变量到下一个B语言的上下文中。这时候,我们就可以使用 set 命令来实现。
例如,我们在C#语言中写了如下代码:
var cars = new []{"Saab", "Volvo","BMW" };
Console.WriteLine(cars[0]);
然后,我们添加一个JavaScript的代码块,通过set命令来获取到共享的变量cars:
#!set --value @csharp:cars --name carsFromCSharp
console.log(carsFromCSharp)
效果如下图所示:

Polyglot还提供了一个变量视图,你可以通过点击下面的按钮进行查看:

(4)用户输入
有时候我们想要让代码更加灵活,往往会依赖于用户输入的值,如输入密码,Key等信息。Polyglot提供了@input前缀来实现。例如,弹出一个框让用户输入一个url,并将用户输入存储到变量url中。
#!set --name url --value @input:"Please enter a URL"
效果如下图所示:

此外,.NET交互内核也提供了一些预置的交互式输入方法供直接使用:
using PolyglotKernel = Microsoft.DotNet.Interactive.Kernel;
# Number Input
var input1 = await PolyglotKernel.GetInputAsync("Pick a number");
input1.Display();
# Password Input
var input2 = await PolyglotKernel.GetPasswordAsync("Pick a password");
input2.Display();
(5)安装NuGet包
我们的C#代码会使用很多组件,就会需要安装一些NuGet包,可以通过Polyglot提供的下列命令来实现:
#r "nuget:<package_name>[,<package_version>]"
例如,我们安装SemanticKernel 1.11.1这个包:

如果不指定版本号,就是安装最新版本。
此外,如果你想添加自定义的NuGet源,则可以使用以下命令:
#i "nuget:https://your-nuget-source/v3/index.json
(6)引入外部文件
我们想要一个代码示例块中引用某个类文件定义的帮助类,实现某个功能的演示,可以使用Polyglot提供的import命令来实现。
例如,我们在某个类文件中定义了一个GetDescription的方法,我们可以这样使用:
#!import Utils/EnumHelper.cs
enum DayOfWeek
{
[Description("Monday")]
Monday = 1,
[Description("Tuesday")]
Tuesday = 2,
[Description("Wednesday")]
Wednesday = 3,
[Description("Thursday")]
Thursday = 4,
[Description("Friday")]
Friday = 5,
[Description("Saturday")]
Saturday = 6,
[Description("Sunday")]
Sunday = 7
}
var desc = EnumHelper.GetDescription(DayOfWeek.Friday);
desc.Display();
(7)呈现Mermaid图
除了写代码块之外,我们还可以使用Mermaid记录代码流来呈现流程图,切换到Mermaid内核即可:

例如,我们有三个class:CheckoutService, CardService 和 ShippingService 共同完成了一个电商系统结账的功能。我们可以通过切换到Mermaid代码环境,通过下面的Mermaid代码完成一个流程图/时序图的绘制,十分方便:
sequenceDiagram
CheckoutService ->> CardService: Charge(card)
CardService -->> CheckoutService: OK, payment cleared
CheckoutService -) ShippingService: Ship(cart)
ShippingService -->> CheckoutService: OK, "shipping cart content"
绘制出来的流程图如下图所示:

推荐内容
Microsoft Learn学习社区: 《多语言笔记本 Polyglot Notebook》
VS Code官方文档:《Polyglot Notebooks in VS Code》
圣杰:《.NET+AI | Semantic Kernel入门到精通》(课程)

.NET程序员的多语言笔记本:Polyglot Notebook的更多相关文章
- 10个足以让你成为更优秀的程序员的C语言资源
一些人觉得编程无聊,一些人觉得它很好玩.但每个程序员都必须紧跟编程语言的潮流.大多数程序员都是从C开始学习编程的,因为C是用来写操作系统.应用程序最常用的语言. · C编程笔记 这些是华盛顿实验学院C ...
- .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)
过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...
- 黑马程序员_ C语言基础之指针(三)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...
- 黑马程序员_ C语言基础(二)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): 1.Hello W ...
- 黑马程序员_ C语言基础(一)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 开发过程: 编写->编译(只编译源文件,编译成*.o 只会检测语法是否合理,不会检测函数是 ...
- 黑马程序员——经典C语言程序设计100例
1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯 ...
- Java程序员学习Go语言—之一
转载:https://www.luozhiyun.com/archives/206 GOPATH 工作空间 GOPATH简单理解成Go语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个 ...
- 一个C++程序员学习C#语言
感悟:C++是一门语法非常严谨的语言,只是指针就很难掌握,这其中肯定要经历很多折腾,特别是自学者. 折腾了一年半的C++,在即将毕业之际,对Unity3d游戏开发感兴趣,先是用cocos2dx开发了个 ...
- 程序员之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程能够分配的内存大小)
主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static ...
- 程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)
主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], ...
随机推荐
- QwQ-32B:用强化学习打造的AI推理黑科技 🚀
现在就体验 QwQ-32B:https://qwq32.com AI界的新星闪耀登场 小伙伴们,AI领域又出现重大突破啦!Qwen团队最新发布的QwQ-32B模型简直太厉害了!这个只有320亿参数的模 ...
- AI应用部署本地步骤
训练 微调 Ollama Gpt-Sovits Stable-Diffusion
- 使用Python可视化莫比乌斯带
引言 莫比乌斯带,这个名字或许大家都听过,但你知道它是什么吗?它是一种非常神奇的几何物体,只有一个面和一个边,乍一看,似乎是个不可思议的存在.今天,我们就来用 Python 轻松地可视化莫比乌斯带,一 ...
- JAVA基础之多线程三期--线程安全问题
一.线程安全问题就是指:多个线程并发访问同一个资源而发生安全性的问题, 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写 操作,一般来说,这个全局变量是 ...
- Tryhackme部分翻译学习
Tryhackme部分翻译学习 1.Weaponization WSH 上传txt到桌面 Set shell = WScript.CreateObject("Wscript.Shell&qu ...
- jmeter性能测试案例:电商系统并发订单测试
场景描述:本案例主要实现多用户同时提交订单,以检测系统对瞬时压力的响应情况.具体流程包括用户登录-添加商品-提交订单.涉及多个接口联动和参数处理,步骤如下: 第一步,登录用户 1.新建"下订 ...
- MySQL 中使用索引一定有效吗?如何排查索引效果?
MySQL 中使用索引一定有效吗?如何排查索引效果? 虽然索引是提升 MySQL 查询性能的常见手段,但并不是所有情况下索引都会有效.索引的使用取决于查询条件.数据分布.索引设计等多个因素.如果索引未 ...
- DP学习总结
动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. -----OI Wiki 例.1-最大子段和 分析 DP四步 ⑴定义状态 定义\(dp_i\)表示以\(i\)结尾的最大子段 ...
- windows下安装maven环境(windows10)
1.下载maven https://archive.apache.org/dist/maven/maven-3/ 2.安装配置 1.解压后新建本地仓库 2.编辑apache-maven-3.0.5-b ...
- 腾讯Java后端一面,被速通了!
分享一篇腾讯的后端Java一面凉经,被速通了, 大家感受一下难度如何. 这次面试的考察覆盖了从 项目经验的深度挖掘(面试官非常看重 STAR 法则的应用)到 扎实的计算机基础(经典的 TCP/UDP ...