Tại sao ** 2 và ² hoạt động khác nhau khi sử dụng toán tử meta chéo?


8

Kết quả là giống nhau dưới cà ri,

say map * **2 , 1, 3, 5, 7, 9;
(1 9 25 49 81)
say map *² , 1, 3, 5, 7, 9;
(1 9 25 49 81)

Mặt khác, các hành vi khác nhau thông qua toán tử meta chéo,

say 1, 3, 5, 7, 9 X**2;
(1 9 25 49 81)
say 1, 3, 5, 7, 9 X²;
((1 2) (3 2) (5 2) (7 2) (9 2))

Tại sao ** 2 và ² hoạt động khác nhau khi sử dụng toán tử meta chéo?

Câu trả lời:


9

Bộ điều Xkhiển meta lấy hai danh sách mà nó đưa ra kết hợp chúng bằng cách sử dụng toán tử mà bạn đưa ra. Nếu bạn không cung cấp cho nó một toán tử, nó sẽ sử dụng ,làm mặc định.

Vì vậy, trong trường hợp này:

say 1, 3, 5, 7, 9 X²

Các Xmetaoperator đang tìm kiếm một toán tử infix. ²không phải là một toán tử infix, nó là postfix.

Vì vậy, Xáp dụng ,như các nhà điều hành. Nhưng bây giờ ²đang được đánh giá là một danh sách và trong trường hợp này, đó là tài sản "số 2" này.

Về cơ bản đây là như nhau:

say 1, 3, 5, 7, 9 X²
say 1, 3, 5, 7, 9 X, 2

Nếu bạn muốn bình phương tất cả các mục trong danh sách bạn muốn sử dụng maptoán tử. Như bạn đã làm lúc bắt đầu.


4

Trong khi đó trên IRC

<Doc_Holliwood> m: ².WHAT.say
<camelia> rakudo-moar ed8f5141f: OUTPUT: «(Int)␤»
<Doc_Holliwood> m: say 2 - ²
<camelia> rakudo-moar ed8f5141f: OUTPUT: «0␤»
* abraxxa has quit (Ping timeout: 252 seconds)
<Doc_Holliwood> where is the magic?
<Doc_Holliwood> m: 2².say
<camelia> rakudo-moar ed8f5141f: OUTPUT: «4␤»
<jnthn> I don't think there's any magic at all, it's just falling out of the standard parsing rules
<AlexDaniel> u: ²⅓
<unicodable6> AlexDaniel, U+00B2 SUPERSCRIPT TWO [No] (²)
<unicodable6> AlexDaniel, U+2153 VULGAR FRACTION ONE THIRD [No] (⅓)
<Doc_Holliwood> somewhere something must be actively distinguishing
<AlexDaniel> so any No has a numeric value
<jnthn> Well, the parser knows when it's looking for a term and when it's looking for a postfix
<AlexDaniel> you can use these unicode characters (that are No) as numeric literals
<AlexDaniel> and yeah, what jnthn said :)
<jnthn> It can't be looking for a postfix if it didn't yet see a term
<AlexDaniel> we had a few tickets about this, people find it very surprising, but the parser doesn't
<Doc_Holliwood> so ² is sometimes an int and sometimes its a postfix depending on context?
<tobs> by the same rule, it can distinguish between multiplication and whatever star
<AlexDaniel> well, similarly, yes
<AlexDaniel> m: say (* * *)(2, 8)
<camelia> rakudo-moar ed8f5141f: OUTPUT: «16␤»
<jnthn> Doc_Holliwood: I guess, though only in the same sense that "+" in +$x is the numify operator, but in $a + $b it's the infix addition operator.
<tobs> m: say 2²⁰
<camelia> rakudo-moar ed8f5141f: OUTPUT: «1048576␤»
<jnthn> In general, the parser is always quite clear about what category of thing it would like to see next.
<AlexDaniel> m: 2 2
<camelia> rakudo-moar ed8f5141f: OUTPUT: «===SORRY!=== Error while compiling <tmp>␤Two terms in a row␤at <tmp>:1␤------> 2⏏ 2␤  expecting any of:␤        infix␤        infix stopper␤       statement end␤        statement modifier␤        statement modifier…»
<AlexDaniel> m: * 2
<camelia> rakudo-moar ed8f5141f: OUTPUT: «===SORRY!=== Error while compiling <tmp>␤Two terms in a row␤at <tmp>:1␤------> *⏏ 2␤  expecting any of:␤        infix␤        infix stopper␤       statement end␤        statement modifier␤        statement modifier …»
<AlexDaniel> m: × 2
<camelia> rakudo-moar ed8f5141f: OUTPUT: «===SORRY!=== Error while compiling <tmp>␤Preceding context expects a term, but found infix × instead.␤at > <tmp>:1␤------> ×⏏ 2␤»
<AlexDaniel> the error messages make it quite transparent :)
<Doc_Holliwood> I'm just trying to wrap my head around the latest SO question. but it makes sense to me now. if ² ist a postfix, but X requires an infix. so X² cant DWTHAM
<Doc_Holliwood> in order for say 1, 3, 5, 7, 9 X² to be 1 , 25, etc you would need to change how X works 
*** <jnthn> m: say (1, 3, 5, 7, 9)>>² ***
<camelia> rakudo-moar ed8f5141f: OUTPUT: «(1 9 25 49 81)␤»
<jnthn> Just use something that expects a postfix op :)
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.