鉴于:
sub abc(Int $n) { say $n }
Run Code Online (Sandbox Code Playgroud)
如果我们传递一个类型的变量Str,abc我们会得到一个编译时错误:
my Str $s = "123"; abc $s;
Run Code Online (Sandbox Code Playgroud)
如果我们传递一个包含字符串的无类型变量,我们会收到运行时错误:
my $s = "123"; abc $s;
Run Code Online (Sandbox Code Playgroud)
C++支持auto允许类型推断的关键字.
是否可以auto在Perl 6中定义类似于:
auto $s = "123";
Run Code Online (Sandbox Code Playgroud)
会导致$s输入Str?
即,我们可以做到以下几点:
auto $s = "123"; abc $s;
Run Code Online (Sandbox Code Playgroud)
并得到一个编译时错误.
Compose功能下面.如果是f并且g是返回值的一元函数,则Compose(f,g)返回一个函数,该函数在被调用时x执行等价于f(g(x)).
static Func<X, Z> Compose<Z, Y, X>(Func<Y, Z> f,Func<X, Y> g)
{ return x => f(g(x)); }
Run Code Online (Sandbox Code Playgroud)
这里有几个简单的Func值可以组成:
Func<int, bool> is_zero = x => { return x == 0; };
Func<int, int> mod_by_2 = x => { return x % 2; };
Run Code Online (Sandbox Code Playgroud)
这有效:
Console.WriteLine(Compose(is_zero, mod_by_2)(4));
Run Code Online (Sandbox Code Playgroud)
但是,如果我改为使用这些等效的静态方法:
static bool IsZero(int n) { return n == 0; }
static int ModBy2(int n) { return n % 2; }
Run Code Online (Sandbox Code Playgroud)
同样的例子不适用于那些.即这会产生编译时错误: …
鉴于以下内容:
open System.Linq
let even n = n % 2 = 0
let seqA = seq { 0..2..10 }
Run Code Online (Sandbox Code Playgroud)
这是一个有效的表达式:
seqA.Where(even)
Run Code Online (Sandbox Code Playgroud)
但这不是:
seqA.All(even)
Run Code Online (Sandbox Code Playgroud)
在Scheme中,您可以使用以下内容迭代多个列表for-each:
> (for-each (lambda (a b) (display (+ a b)) (newline)) '(10 20 30) '(1 2 3))
11
22
33
>
Run Code Online (Sandbox Code Playgroud)
我知道在Perl中你可以使用for迭代单个列表.如Scheme示例中那样迭代多个列表的好方法是什么?
我对Perl 5或6的答案很感兴趣.
下面是Conway在WPF中的生命游戏的一个(非常天真)实现.这只是一个演示......
XAML:
<Window x:Class="wpf_conway_life_2013_05_19.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="500" Width="500">
<Grid>
<Canvas Name="canvas"
Width="auto"
Height="auto"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
</Canvas>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
代码背后:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace wpf_conway_life_2013_05_19
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var random = new Random();
var data = new int[100, 100];
var dataB = new int[100, 100];
Func<int, int, int> at = (x, y) =>
{
if (x < 0) x = 100 + …Run Code Online (Sandbox Code Playgroud) sqrt 可以通过函数语法调用:
> sqrt 16
4
Run Code Online (Sandbox Code Playgroud)
它也可以通过方法语法调用:
> 16.sqrt
4
Run Code Online (Sandbox Code Playgroud)
有没有办法通过方法语法使用户定义的子程序可以调用?
例如,让我们定义sq:
> sub sq(Int $n) { $n*$n }
sub sq (Int $n) { #`(Sub|64042864) ... }
> sq 4
16
Run Code Online (Sandbox Code Playgroud)
有没有办法让它可以作为方法调用?即
> 4.sq
Run Code Online (Sandbox Code Playgroud) 这是来自Charles C Pinter的"摘要代数之书"的练习5.F.2:
我们
G是该组{e, a, b, b^2, b^3, ab, ab^2, ab^3},其发电机满足a^2 = e,b^4 = e,ba = ab^3.写下表G.(G称为二面体组D4.)
这是一个小的Perl 6程序,它提供了一个解决方案:
sub generate(%eqs, $s)
{
my @results = ();
for %eqs.kv -> $key, $val {
if $s ~~ /$key/ { @results.push($s.subst(/$key/, $val)); }
if $s ~~ /$val/ { @results.push($s.subst(/$val/, $key)); }
}
for @results -> $result { take $result; }
my @arrs = @results.map({ gather generate(%eqs, $_) }); …Run Code Online (Sandbox Code Playgroud) 我想在github上托管我的一些C#VisualStudio 2010项目.我猜想至少添加一个最小的.git/info/exclude文件是一个好习惯.对于我的FluentWpf项目,我在我的exclude文件中有这个:
FluentWpf/bin/*
FluentWpf/obj/*
Run Code Online (Sandbox Code Playgroud)
在将项目检入git之前是否还有其他最佳实践要遵循?
这是swap两元素元组的函数:
fn swap<A, B>(obj: (A, B)) -> (B, A)
{
let (a, b) = obj;
(b, a)
}
Run Code Online (Sandbox Code Playgroud)
使用示例:
fn main() {
let obj = (10i, 20i);
println!("{}", swap(obj));
}
Run Code Online (Sandbox Code Playgroud)
有没有办法swap在两元素元组上定义方法?即它可以被称为:
(10i, 20i).swap()
Run Code Online (Sandbox Code Playgroud) 我已经构建了如此处所述的Roslyn源代码.
我想在C#编译器中添加一个断点,并逐步完成这个简单程序的补充:
using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var result = 1 + 2;
Console.WriteLine(result);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我应该在哪里设置断点?它应该在编译过程的早期,因为我想逐步解析甚至是lexing.
如果我将CompilerExtension设置为启动项目并按F5(开始调试),则会启动运行新构建的编译器的Visual Studio副本.我想避免每次我想要逐步完成编译器时都启动一个新的Visual Studio实例.设置一个直接在上面的源上调用编译器代码的小程序有什么好方法?