Skip to content

Instantly share code, notes, and snippets.

Avatar

Nobuyuki Iwanaga ufcpp

View GitHub Profile
@ufcpp
ufcpp / FixedArray.cs
Created Jul 16, 2021
fixed-size array
View FixedArray.cs
using System;
using System.Runtime.InteropServices;
namespace GenericMath
{
class FixedArraySample
{
public static void M()
{
// 「generic math」以外でまず真っ先に「固定長配列」をやりたかったんだけど…
@ufcpp
ufcpp / A.cs
Created May 14, 2021
Records with sealed base ToString override #4174
View A.cs
// この状態(明示的な ToString オーバーライドなし)は、record のデフォルト動作。
//
// R { Name = abc }
// D1 { Name = D1 }
// D2 { Name = D2 }
Console.WriteLine(new R("abc"));
Console.WriteLine(new D1());
Console.WriteLine(new D2());
@ufcpp
ufcpp / StaticMethod.cs
Created May 10, 2021
static っぽく見えるけどインスタンスメソッドが生成されることがあるやつ
View StaticMethod.cs
using System;
class Program
{
static void Main()
{
Action a1 = M;
Console.WriteLine(a1.Method.IsStatic); // true
Action a2 = static () => { };
@ufcpp
ufcpp / Variance.cs
Created Apr 16, 2021
covariance の解析、null 許容参照型の方がジェネリクスよりも賢い
View Variance.cs
#nullable enable
using System.Collections.Generic;
// nullability は out 引数でも variance が効く。
string notNull = "";
string? nullable = null;
A.In<string?>(notNull);
A.In<string?>(nullable);
@ufcpp
ufcpp / Inverse.cs
Created Apr 1, 2021
掛けて1になる整数
View Inverse.cs
// https://github.com/dotnet/csharplang/issues/4436 を見てて書きたくなったコード。
// virtual static member の最大用途は generic math。
// numpy とかを使う層を取り込みたいみたい。
// これが来れば0コスト抽象なガロア拡大体とか書けるかもしれないなぁと。
using System;
// 整数型の奇数には必ず「逆元」がある。
// 「オーバーフロー前提で掛けて1になる数」がただ1つある。
for (uint n = 3; n != 1; n += 2)
@ufcpp
ufcpp / emoji.md
Last active Mar 29, 2021
絵文字の自前処理
View emoji.md

絵文字の自前処理

絵文字の数

以下、Unicode 13.1 での話。

単独の絵文字

単独の絵文字は emoji-data の Emoji 属性が付いてる文字。 このテーブルの1列目をパースすればテーブル化可能。

@ufcpp
ufcpp / ContextualKeywords.cs
Created Feb 24, 2021
C# 9.0 で普通にコンパイルできるコード。semantics なしで lexical な情報だけ見てるコード整形ツールとかでガチで困ってるらしい。
View ContextualKeywords.cs
// record はキーワードの record が優先。
// この行の @ を外すとコンパイル エラー。
// これも「そうせざるを得なかった」みたいなノリで、できるのなら dynamic, var と同じ方針にする可能性もあった。
@record record = new record { };
// この2行はエラーにならない。
dynamic dynamic = new dynamic();
var var = new();
// この行も OK。
@ufcpp
ufcpp / AssemblyReferences.cs
Created Dec 15, 2020
参照してる dll のバージョン調査
View AssemblyReferences.cs
#define A
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
var folders = new[]
View Init.cs
using System;
var s = new S { I = 1 };
Console.WriteLine(s.I);
readonly struct S
{
readonly int _i;
public int I { get => _i; init => _i = value; }
@ufcpp
ufcpp / GetTextElementEnumeratorNet5.cs
Created Nov 10, 2020
.NET 5.0 で GetTextElementEnumerator がまともになったらしい
View GetTextElementEnumeratorNet5.cs
using System;
using System.Globalization;
// net5.0 で実行するとちゃんと4要素列挙される。
// (netcoreapp3.1 だと Emoji ZWJ Sequence に対応してなくて数十個に分かれる。)
var s = "👩🏻‍👦🏼👨🏽‍👦🏾‍👦🏿👩🏼‍👨🏽‍👦🏼‍👧🏽👩🏻‍👩🏿‍👧🏼‍👧🏾";
var e = StringInfo.GetTextElementEnumerator(s);
while (e.MoveNext())