Guile语法规则在GNU手册中匹配关于elipsis和不正确列表的混淆

时间:2016-06-14 18:43:00

标签: scheme guile

我很难跟上一些关于宏(https://www.gnu.org/software/guile/manual/guile.pdf)的GNU guile手册的文档:

在第6.10.2.1节(关于模式的第259页)中,有一节讨论如何匹配不正确的列表,如elipsis关键字:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace multirectangle
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    }
    Bitmap background;
    Graphics scG;

    Rectangle rectangleObj;

    private Point clickCurrent = Point.Empty;
    private Point clickPrev = Point.Empty;


    private void Form1_Load(object sender, EventArgs e)
    {
        background = new Bitmap(Width, Height);
        rectangleObj = new Rectangle(10, 10, 30, 30);
        scG = Graphics.FromImage(background);
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        clickCurrent = PointToClient(Cursor.Position);
        clickPrev = clickCurrent;
        if (clickPrev == Point.Empty) return;
        rectangleObj.X = clickPrev.X - rectangleObj.Height / 2;// +radius; 
        rectangleObj.Y = clickPrev.Y - rectangleObj.Width / 2;
        Refresh();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        pe.Graphics.DrawImage(Draw(), 0, 0);

    }
    public Bitmap Draw()
    {
        Graphics scG = Graphics.FromImage(background);
        Pen myPen = new Pen(System.Drawing.Color.Red, 3);
        scG.Clear(SystemColors.Control);
        scG.DrawEllipse(myPen, rectangleObj);
        return background;

    }
}
}

然后说明这是不可取的,因为(define-syntax let1 (syntax-rules () ((_ (var val) . exps) (let ((var val)) . exps)))) 中的非列表exps将匹配。但是,我无法扩展这种表达方式。但是,以下表达式会扩展:

  • (let (foo 'bar) . baz))(let1 (foo 'bar) . (baz))
  • (let (foo 'bar) baz)(let1 (foo 'bar) baz)

同样在以下关于改进的讨论中:

(let (foo 'bar) baz)

它声明(define-syntax let1 (syntax-rules () ((_ (var val) exp ...) (let ((var val)) exp ...)))) 将匹配,我再次无法匹配。不过我可以这样做:

  • (let1 (foo 'bar))(let1 (foo 'bar) baz)

在进一步抨击我的头之前,如果有人可以澄清不正确和省略模式匹配是如何工作的(并且文档中是否存在拼写错误,或者我的Guile安装/宏扩展方法有问题)将会很棒?)。我正在使用Guile 2.0.9(文档在2.0.11上,但不会认为这会如此重要),我正在使用Geiserthis guide进行宏扩展(结果没有差异):

(let (foo 'bar) baz)

谢谢!此外,如果任何人都可以推荐任何其他好的,更简洁的Scheme(优先在Guile)宏的资源,那也很棒!

0 个答案:

没有答案