我很难跟上一些关于宏(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上,但不会认为这会如此重要),我正在使用Geiser和this guide进行宏扩展(结果没有差异):
(let (foo 'bar) baz)
谢谢!此外,如果任何人都可以推荐任何其他好的,更简洁的Scheme(优先在Guile)宏的资源,那也很棒!