silverlight动态:动态语言和 Silverlight

动态语言和 Silverlight目录

  获得 DLRConsole

  使用 DLRConsole

  深入了解代码

  2 + 2 这个问题有多难?

  别急还有更多需要讨论

  立即动手尝试吧!

  孩子们是从创造性玩耍中学习知识从乐高 (LEGO) 玩具到 GI Joe 玩具和芭比娃娃(我发誓这些都是我姐姐玩具)孩子们总是把拿起玩具然后凭直觉来鼓捣它们他们不会拿出玩具手册来阅读至少不会为了解玩具玩法而阅读手册!当“做事情正确方式”尚未深深地印入脑海时通过体验和摆弄东西来了解事物可以说是人类本性儿童尤其如此勿庸置疑这种动手实战是种最佳学习思路方法

  以同样观点来看软件Software动态语言通常和交互环境相关联为您提供种“执行 - 评估 - 输出”循环(Run-Evaluate-Pr LoopREPL)允许使用探索性“尝试 - ”法进行编程从某种意义说REPL 思路方法使编程变成种注重动手操作“玩耍”这就是为什么动态语言倡导者常常说“你只要摆弄下就知道是如何回事了”

  当我团队(Team)将动态语言集成到 Silverlight™ 中时大家马上就想让它能够结合 Silverlight 起使用Jim Hugunin 只做了些巧妙编程DLRConsole 就诞生了本专栏将探讨 DLRConsole 工作原理并进而讨论 IronPython、DLR 托管以及 DLR 和 Silverlight 集成

  获得 DLRConsole

  本地运行 DLRConsole

  您可以将 DLRConsole 下载到本地计算机上运行但是设置上稍微复杂这需要 Web 服务器支持在设置好 Web 服务器后您即可解压缩 DLRConsole.zip 文件并将该文件夹置于 Web 服务器文件夹中然后在您 Web 服务器上导航到 /DLRConsole/index.htm(如何在计算机上设置 Web 服务器不在本专栏讨论范围内但您可以在 iis.net/articles/view.aspx/IIS7/Deploy-an-IIS7-Server/Installing-IIS7/Install-IIS7-on-Vista 上找到 Windows Vista 下些设置指南以及在 docs.info.apple.com/article.html?path=Mac/10.4/en/mh1921.html 上找到 Mac OS 10.4 下些设置指南)

  在自己 Web 服务器上运行时只需注意即需要将服务器配置设置为支持 DLR 语言如果出现以下消息则介绍说明有问题:

Silverlight error message  
ErrorCode: 2024
ErrorType: ParserError   
Message: Invalid attribute value text/python.  
XamlFile: DLRConsole.xaml  
Line: 6  
Position: 53
  这时您需要将以下 MIME 类型映射添加到服务器配置中:

.py text/python
.jsx text/jscript
  至此就可以庆贺下了:您可以运行 DLR Silverlight 应用了!

  但是在深入探讨 DLRConsole 的前我或许应该先大致介绍下动态语言运行时 (DLR)这是个运行于 CLR 的上动态语言支持系统它提供了大多数动态语言实现所需语言服务这些服务包括动态类型系统、动态思路方法调度、动态代码生成和宿主 API有关 DLR 详细信息请参阅 Jim Hugunin 博客文章网址为 blogs.msdn.com/hugunin/ archive/2007/04/30/a-dynamic-language-runtime-dlr.aspx

  DLRConsole 是个 Silverlight 1.1 举例演示了个非常轻量级代码开发和实验工具(请注意自 2008 年 1 月 1 日起Silverlight 1.1 已更名为 Silverlight 2.0)它允许您编辑和执行 XAML 和 Python 代码并在支持代码着色和代码自动完成交互式编辑器中使用 Python 和 JScript® 进行实验

  DLRConsole 从两方面体现了 DLR 和 Silverlight 集成方面它是个用 DLR 兼容语言 IronPython 编写 Silverlight 应用方面它利用了 DLR 宿主 API 来执行键入到控制台和编辑器中 DLR 代码

  您可以从 silverlight.net/Samples/1.1/DLR-Console/DLRConsole.zip 下载 DLRConsole 代码到本地执行如果您只想交互式地使用 DLRConsole请访问 silverlight.net/Samples/1.1/DLR-Console/python 上托管版本要运行 DLRConsole计算机上必须安装 Silverlight在未安装 Silverlight 情况下运行 DLRConsole 时会提示您 Silverlight 下载链接;但如果您希望提前安装适用于 Windows® 或 Apple 平台 Silverlight请访问 microsoft.com/silverlight/.aspx如果您使用是基于 Linux 操作系统请访问 mono-project.com/Moonlight参考针对 Linux Silverlight 实现 - Mono Moonlight 项目

  使用 DLRConsole

  在浏览器中运行 DLRConsole 思路方法有两种种是从 silverlight.net 运行种是在自己计算机上本地运行出于本专栏我将演示从 Silverlight.net 运行思路方法但如果您希望下载 DLRConsole.zip、浏览该代码以及在自己开发机或本地服务器上运行请参阅“本地运行 DLRConsole”侧栏提供些实用窍门技巧

  首先请在浏览器中打开 silverlight.net/Samples/1.1/DLR-Console/python就是这样!您应该能在浏览器中看到 DLRConsole 打开时情景如图 1 所示

动态语言和 Silverlight

  图 1正在打开 DLRConsole

  加载 DLRConsole 时会显示 Python 命令提示符供您逐行键入 Python 代码键入代码后您可以立即在控制台或 Silverlight 画布中看到其效果如图 2 所示您可以单击区别语言将控制台切换到相应语言并查看所选语言举例代码块在键入语句时尝试混合搭配使用各种语言并注意比较区别语言完成工作方式

动态语言和 Silverlight

  图 2正向控制台中写入代码

  XAML 选项卡显示是 Silverlight Canvas 窗格 XAML 代码(参见图 3)您可以编辑该代码或添加其他代码然后按 Ctrl+Enter 更新画布

动态语言和 Silverlight

  图 3XAML 窗格

  Python Code 选项卡显示 Python 代码块该代码块将生成带有文字蓝色背景鼠标悬停在文字上方时文字会改变颜色同样在第次更改和进行任何更改的后您需要按 Ctrl+Enter 才能执行此代码

  About 选项卡提供了到 CodePlex 上 Dynamic Silverlight 网页链接 (codeplex.com/dynamicsilverlight)

  深入了解代码

  您已经了解了 DLRConsole 可以做些什么下面来看看 DLRConsole 由哪些文件组成以及 DLRConsole 工作原理图 4 列出了下载 DLRConsole 包中包含源文件

动态语言和 SilverlightFigure4DLRConsole 源文件

文件 介绍说明
Index.htm 简单 HTML 页面包含 Silverlight.js 和 CreateSilverlight.js并对 CreateSilverlight 进行
Silverlight.js 包含在浏览器中创建 Silverlight 应用逻辑
CreateSilverlight.js 定义 CreateSilverlight用以化 Silverlight 和加载 DLRConsole.xaml
DLRConsole.xaml 个指向 DLRConsole.py XAML 小文件该文件将 Loaded 事件绑定到 _disibledevent=>  request = .Windows.Browser.Net.BrowserHttpWebRequest(uri)
  response = request.GetResponse
  reader = .IO.StreamReader(response.GetResponseStream)
  xaml = reader.ReadToEnd
  reader.Close
   XamlReader.Load(xaml)  这种思路方法实际上是下载所提供 URL 并返回 XamlReader.Load 结果

  DLRConsole.xaml 会加载 DLRConsole.py然后 Python 代码中定义 _disibledevent=>xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  <x:Code Source="DLRConsole.py" Type="text/python" />
  <Canvas x:Name="loadingHelper" Loaded="OnLoaded" />
</Canvas  由于总共有 2164 行 Python 代码因此我并不打算完完整整地展示 DLRConsole.py 全部内容而是只讨论最有趣部分

  从 XAML 文件被加载、OnLoaded 被刻起Silverlight 即开始由 Python 和 DLR 驱动OnLoaded 化 Application 类最终您会执行到 Application.Initialize(self) 思路方法屏幕上所有内容都出自于此它会注册 KeyHandler创建 ConsoleWindow、Editors 和其余用户界面并启动控制台以便您进行交互式体验

  2 + 2 这个问题有多难?

  现在您有了个在浏览器中运行交互式控制台看上去不错!下面就让我们来次典型动态语言测试:2 + 2看看会有什么事情发生

  首先在控制台中键入“2 + 2”

py> 2 + 2
4
py>
  在键入同时您可能希望看到自己键入内容但是从 WPF 角度来看这需要通过 Application Initialize 思路方法行来实现:

self.KeyHandler = TextInputHandler(self.root)  此代码构造了 TextInputHandler它定义了按键文本表示并将 TextInputHandler _disibledevent=>    self.DoInput(key.Ctrl)
  el key.Text '.':
    self.DoCompletions
  el key.Name 'Up' and self.Caret.line 0:
    self.DoHistory
  :
    Editor.HandleKey(self, key)  在本例中DoInput 了 DoSingleLine后者会尝试解析表达式如果解析成功它会计算表达式结果并将输出内容写入到控制台同时设置“_”自由变量 (Convenience Variable)(参见图 5)如果有兴趣您可以查看源代码了解 TryExpression 是如何解析表达式以及 GetEngine 是如何创建 LanguageEngine

动态语言和 SilverlightFigure5DOSingleLine 分析

def DoSingleLine(self, text, forceExecute):
  text1 = self.le.TryExpression(text)
   text1:     
    self.WriteInputToConsole(text)
    try:
      ret = self.Engine.Evaluate(text1, self.CurrentModule)
       ret is not None:
        self.console.write(repr(ret) + 'n', 'output')
        self.CurrentModule.SetVariable('_', ret)
        except Exception, e:
          self.HandleException(e)
    :
      self.DoMultiLine(text, forceExecute)
  这就是在 DLRConsole 中计算 2+2 所需要操作实际上该举例涵盖了所有可以处理单行指令通过少量变体您也可以处理多行指令而最有趣地方是 DLRConsole 是 DLR 来执行代码

  别急还有更多需要讨论

  2 + 2 是个非常简单例子面对更复杂情况会怎样呢?好了我们以 .NET Framework 集成为例看下情况如何请看以下举例:

py> import
py> from .Collections import *
py> h = Hashtable
py> h["a"] = "IronPython"
py> h{"b"] = "in Silverlight"
py> for e in h: pr e.Key, ":", e.Value
a: IronPython
b: in Silverlight
  如您所见您可以从 IronPython 使用 .Collections工作方式类似 Python 散列或 .NET Framework 散列无论您选择何种方式我在MSDN® 杂志2006 年 10 月刊 (msdn.microsoft.com/msdnmag/issues/06/10/CLRInsideOut) 中使用了同举例只是现在是在浏览器中运行有空时候您可以阅读这篇文章详细了解 IronPython 和 .NET 集成但是请记住文章内容可能已经有些过时有关其他信息可以访问 blogs.msdn.com/ironpython

  那么和画布交互又怎样呢?让我们看看 Application 类 StartConsole 思路方法:

def StartConsole(self, console, canvas, langInfo):  
  ...
  console.CurrentModule.SetVariable("canvas", canvas)
  console.CurrentModule.SetVariable("wpf", wpf)
  ...
  当 DLRConsole 化控制台时它会自动为您设置几个变量其中包括个 WPF 帮助模块和个指向画布指针有了这些变量您就可以编写如图 6 所示代码它将实现鼠标划过时颜色变化效果如果要在运行中查看此代码请选择 Python Code 选项卡并按 Ctrl+Enter

动态语言和 SilverlightFigure6鼠标划过事件

import wpf
canvas.Background = wpf.BlueBrush
r = wpf.TextBlock
r.Text = "Touch Me"
canvas.Children.Add(r)
r.FontSize = 60
wpf.SetPosition(r, 40, 60)
def light(s, e):
 s.Foreground = wpf.SolidColorBrush(wpf.Colors.White)
def dark(s, e):
 s.Foreground = wpf.SolidColorBrush(wpf.Colors.Black)
r.MouseEnter light
r.MouseLeave dark
  在键入这些举例时您是否注意到在键入后带句点类名或对象名时会弹出个小框?DLRConsole 支持种团队(Team)成员喜欢称的为“代码联想”(Code-Sense) 功能这种功能并不像 Visual Studio® IntelliSense® 功能那么高级它只是个举例但在查找适用于给定对象思路方法或属性时却很有帮助(参见图 7)

动态语言和 Silverlight

  图 7代码自动联想

  借助此功能您可以使用向上/向下键选择需要元素按 Enter 进行选择然后继续键入其他内容要了解此功能使用方法让我们再看看 HandleKey 思路方法:

def HandleKey(self, key):
   key.Text 'n':
    self.DoInput(key.Ctrl)
  el key.Text '.':
    self.DoCompletions
  el key.Name 'Up' and self.Caret.line 0:
    self.DoHistory
  :
    Editor.HandleKey(self, key)
  对于只有 100 多行 Python 代码而言这是个非常不错功能

  从 Python 到 JScript

  前面我提到过DLRConsole 支持多种 DLR 语言目前发布版本支持 Python 和 JScript由于这些语言都构建于 DLR 的上因此它们不仅能和 .NET 集成而且还可以跨语言共享声明以下演示了如何在 Python 和 JScript 的间共享变量和思路方法:

js> a = 2 + 2
4.0
py> b = a * 2
py> b
8.0
js> function times10(n) {
js|  n * 10
js| }
py> times10(5)
50.0
  要完成此操作您只需单击要使用编程语言控制台提示、语法着色当然还有语言即会做相应更改这通过告知控制台设置其语言并委托给 Editor 来实现:

def SetLanguage(self, name):
  self.le = GetEngine(name)
  self.Engine = self.CurrentEngine = self.le.engine
  self.TokenCategorizer =
    self.Engine.LanguageProvider.GetTokenCategorizer
  乍看起来这好像并不实用但实际上它让开发人员可以随意选用自己熟悉语言而不必因实现语言而限制自己代码使用从而能够获得前所未有代码重用性事实表明开发人员在使用自己熟悉语言编写时最富有创造性因此这甚至可以极大地改善软件Software质量

  立即动手尝试吧!

  DLRConsole 让您能够以最低投入来探索和研究 Silverlight 及动态语言使用除了 Silverlight 以外您甚至不需要安装任何软件Software和在其他人托管沙盘中进行实验相比还有更好选择吗?

  请时常访问 codeplex.com/dynamicsilverlight关注有关 Silverlight 中动态语言集成新版本信息以及 Silverlight 动态语言举例新版本和更新版本版本应该也会包含对 IronRuby 支持您现在就可以从 www.ironruby.net 上下载 IronRuby当然您也可以像以往从 codeplex.com/ironpython 下载 IronPython如果您有兴趣了解更多 Silverlight 举例可以从 Silverlight 社区库中找到大量有趣举例网址是:silverlight.net/community/communitygallery.aspx

Tags:  silverlight是什么 silverlight.2.0 silverlight silverlight动态

延伸阅读

最新评论

发表评论