Làm thế nào để vượt qua params token được tham chiếu theo biến?


10

Tôi có thể dễ dàng sử dụng chữ ký mã thông báo bằng cách sử dụng tên mã thông báo trực tiếp:

my token t ( $x ) { $x };

'axb' ~~ / 'a' <t: 'x'> 'b' /;      # match
'axb' ~~ / 'a' <t( 'x' )> 'b' /;    # match

Tuy nhiên tôi chưa tìm thấy cách nào để làm điều này, khi mã thông báo được lưu trữ trong biến:

my $t = token ( $x ) { $x };

'axb' ~~ / 'a' <$t: 'x'> 'b' /;
'axb' ~~ / 'a' <$t( 'x' )> 'b' /;

Cả hai cho:

===SORRY!=== Error while compiling ...
Unable to parse expression in metachar:sym<assert>; couldn't find final '>'

Cú pháp kỳ diệu để làm điều đó là gì?

BTW: Tôi thậm chí đã duyệt bộ thử nghiệm Raku và nó không bao gồm trường hợp như vậy roast/S05-grammar/signatures.t.

Câu trả lời:


8

Hoặc:

  • Sử dụng giải pháp trong câu trả lời của jnthn để cho Raku biết rõ bạn muốn sử dụng $biến mã thông báo sigil'd của bạn như một Callable.

  • Khai báo biến như Callableở vị trí đầu tiên và thực hiện thay đổi tương ứng trong cuộc gọi:

my &t = token ( $x ) { $x };

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」

2
Có thể được sử dụng để chỉ ra rằng các mã thông báo chỉ là regexen với các thuộc tính nhất định được đặt và lần lượt regexen là Callables, do đó chúng có thể đi vào &các biến.
user0721090601

1
Cảm ơn! Trong khi jnthn trả lời câu hỏi của tôi rất trực tiếp, tôi đánh dấu câu hỏi này như một câu trả lời, bởi vì nó nhấn mạnh nguyên nhân thực sự của vấn đề của tôi - sigil sai. Xử lý mã thông báo như Callable ngay từ đầu là giải pháp sạch hơn nhiều.
Pawel Chihuahuaian bbkr

11

Đặt một &trước biến:

my $t = token ( $x ) { $x };
say 'axb' ~~ / 'a' <&$t: 'x'> 'b' /;
say 'axb' ~~ / 'a' <&$t( 'x' )> 'b' /;

Trình phân tích cú pháp tìm kiếm &, và sau đó ủy quyền cho quy tắc phân tích biến Raku, sẽ vui vẻ phân tích cú pháp ngữ cảnh như thế này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.