Latex3: tentukan \tl_if_integer:n

Dibuat pada 5 Jul 2021  ·  19Komentar  ·  Sumber: latex3/latex3

Hai,

Akan menyenangkan untuk menguji apakah daftar token adalah bilangan bulat atau tidak, tanpa menggunakan __int_to_ roman:w internal :

\prg_new_conditional:Npnn \tl_if_integer:n #1 { p, T, F, TF }
{
  \tl_if_blank:oTF { \__int_to_roman:w -0#1 }
   {
    \prg_return_true:
   }
   {
    \prg_return_false:
   }
}

Komentar yang paling membantu

Saya setuju masuk akal untuk memberikan \str_if_integer:nTF , tetapi belum jelas apa bilangan bulat yang diizinkan. Agaknya spasi harus diizinkan di antara tanda-tanda, tetapi tidak dalam bilangan bulat karena TeX tidak mengizinkannya?

Kode berdasarkan \romannumeral terputus untuk string digit yang panjang, dengan kesalahan "angka terlalu besar". Agaknya kita membutuhkan proses yang lebih lambat yang hanya mengambil beberapa digit pada satu waktu, tetapi kemudian akan mengganggu untuk mendeteksi spasi di antara digit.

Alternatif/tambahan adalah \str_to_integer:nF yang membersihkan string jika terlihat "cukup" seperti bilangan bulat (kita bisa memutuskan untuk menjadi agak longgar (tetapi didokumentasikan dengan baik)) dan jika tidak meninggalkan argumen kedua di aliran input.

Semua 19 komentar

Lebih baik di sini:

\prg_new_conditional:Npnn \tl_if_integer:n #1 { p, T, F, TF }
{
  \tl_if_blank:nTF{#1}
    {
      \prg_return_false:
    }
    {
      \tl_if_blank:oTF { \__int_to_roman:w -0#1 }
      {
        \prg_return_true:
      }
      {
        \prg_return_false:
      }
    }
}

Nama tampak aneh: Itu tidak benar-benar memeriksa bilangan bulat (misalnya -5 adalah bilangan bulat tetapi mengembalikan false, +7 mengembalikan false juga). Tampaknya lebih seperti ujian jika hanya ada angka.

@zauguin Ok untuk nama tetapi fungsinya berguna, dan cocokkan dengan centang lama buku teks untuk memeriksa apakah digitnya. Saya setuju bahwa integer dapat diimplementasikan menggunakan regex tetapi akan lambat

Ditingkatkan dengan komentar Anda:

\prg_new_conditional:Npnn \tl_if_digit:n #1 { p, T, F, TF }
{
  \tl_if_blank:nTF{#1}
    {
      \prg_return_false:
    }
    {
      \tl_if_blank:oTF { \__int_to_roman:w -0#1 }
      {
        \prg_return_true:
      }
      {
        \prg_return_false:
      }
    }
  }
\prg_generate_conditional_variant:Nnn \tl_if_digit:n { o } { p, T, F, TF }
\prg_new_conditional:Npnn \__tl_if_integer:n #1 { p, T, F, TF }
{
    \exp_args:No\str_if_eq:onTF{\tl_head:n{#1}}{+}
    {
      \exp_args:No\tl_if_digit:oTF{\tl_tail:n{#1}}
      {
        \prg_return_true:
      }
      {
        \prg_return_false:
      }
    }
    {
      \exp_args:No\str_if_eq:onTF{\tl_head:n{#1}}{-}
      {
        \exp_args:No\tl_if_digit:oTF{\tl_tail:n{#1}}
        {
          \prg_return_true:
        }
        {
          \prg_return_false:
        }
      }
      {
        \prg_return_false:
      }
    }
}
\prg_new_conditional:Npnn \tl_if_integer:n #1 { p, T, F, TF }
{
  % fast path
  \tl_if_digit:nTF{#1}
  {
    \prg_return_true:
  }
  {
    % slow path
    \__tl_if_integer:nTF{#1}
    {
      \prg_return_true:
    }
    {
      \prg_return_false:
    }
  }
}

@bastien-roucaries TeX menerima banyak tanda di depan angka, jadi tes Anda biasanya cukup tetapi tidak selalu. Jika ini diterapkan, itu bisa memungkinkan banyak tanda seperti ini:

\ExplSyntaxOn
\prg_new_conditional:Npnn \str_if_integer:n #1 { p, T, F, TF }
  { \exp_after:wN \__str_if_integer_sign:N \tl_to_str:n {#1} \scan_stop: }
\cs_new:Npn \__str_if_integer_sign:N #1
  {
    \if:w $
        \if_meaning:w - #1 F \fi:
        \if_meaning:w + #1 F \fi: $
      \exp_after:wN \__str_if_integer_digits:w \exp_after:wN #1
    \else:
      \exp_after:wN \__str_if_integer_sign:N
    \fi:
  }
\cs_new:Npn \__str_if_integer_digits:w #1 \scan_stop:
  {
    \tl_if_blank:nTF {#1}
      { \prg_return_false: }
      {
        \tl_if_blank:oTF { \__int_to_roman:w -0#1 }
          { \prg_return_true: }
          { \prg_return_false: }
      }
  }

\cs_new:Npn \test #1
  { \typeout { #1: \str_if_integer:nTF {#1} { INT } { NOT } } }

\test {   }
\test { ~ }
\test { 1 }
\test { - }
\test { -1 }
\test { +1 }
\test { +-+-+-1 }

\stop

Tesnya adalah str untuk mencegah perluasan token dalam argumen. Baik milik saya maupun implementasi Anda tidak memperluas tanda, tetapi memperluas digit dengan \romannumeral . Versi tl mungkin harus memperluas semuanya sesuai kebutuhan.

Saya setuju masuk akal untuk memberikan \str_if_integer:nTF , tetapi belum jelas apa bilangan bulat yang diizinkan. Agaknya spasi harus diizinkan di antara tanda-tanda, tetapi tidak dalam bilangan bulat karena TeX tidak mengizinkannya?

Kode berdasarkan \romannumeral terputus untuk string digit yang panjang, dengan kesalahan "angka terlalu besar". Agaknya kita membutuhkan proses yang lebih lambat yang hanya mengambil beberapa digit pada satu waktu, tetapi kemudian akan mengganggu untuk mendeteksi spasi di antara digit.

Alternatif/tambahan adalah \str_to_integer:nF yang membersihkan string jika terlihat "cukup" seperti bilangan bulat (kita bisa memutuskan untuk menjadi agak longgar (tetapi didokumentasikan dengan baik)) dan jika tidak meninggalkan argumen kedua di aliran input.

@blefloch Apa batas yang didokumentasikan dari \romannumeral ?

@bastien-roucaries Integer terbesar yang dapat ditangani TeX: 2³¹−1 = 2147483647.

@PhelypeOleinik Tampaknya @blefloch berarti +-+-+-+-+-+-+-+-+-+-+-+-+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Jadi berapa ukuran string maksimal?

@bastien-roucaries \romannumeral hanya terputus dengan "Angka terlalu besar" untuk angka bukan nol. TeX dapat mengambil string nol yang panjangnya sewenang-wenang selama bilangan bulat yang dihasilkan berada dalam kisaran [−2³¹−1, 2³¹−1].

@bastien-roucaries @blefloch Saya tidak akan melupakan bilangan bulat dalam format heksadesimal atau oktal. Dan

-`a

adalah bilangan bulat juga.

ada tes internal untuk digit di l3bitset \__bitset_test_digits:nTF . Itu tidak menangani tanda-tanda karena ini tidak dibutuhkan tetapi harus menangani ekspresi integer.

seperti yang baru saja diisyaratkan oleh @ eg9 , apa kasus penggunaan sebenarnya di sini? Apakah itu pemeriksaan dokumen tingkat pengguna untuk string digit, atau pemeriksaan bahwa string tersebut adalah input yang valid ke fungsi integer expl3. Yang terakhir tampaknya lebih berguna dalam konteks expl3, dan pada dasarnya berarti bahwa tidak ada yang tersisa setelah \numexpr#1 sehingga pemeriksaan lambat untuk string literal digit tidak diperlukan.

@davidcarlisle Bug ini tentang kasus pertama, tetapi saya ingin menggunakan yang kedua

Saya tidak berpikir bahwa saya mendukung perluasan lapisan pemrograman L3 dengan ekstensi acak yang (mungkin) berguna dalam situasi khusus tetapi tidak memiliki kasus penggunaan yang jelas dan diperlukan secara teratur. Bagi saya ini adalah salah satu contohnya. Jika kita mulai dengan itu, di mana kita berakhir? Berapa banyak "is this tl some X" yang harus kita dukung? Suara saya untuk ini adalah tidak; bukan untuk bahasa inti.

@FrankMittelbach Mengetahui f kita dapat melakukan beberapa perhitungan atau tidak pada TL berguna. Yang lain dapat dilakukan menggunakan regex, tetapi dengan jebakan yang tidak berfungsi dalam konteks yang diperluas (dan saya perlu tes ini untuk bekerja dalam konteks yang diperluas)

Tanpa keraguan. Tetapi apakah itu cukup berguna untuk menjamin dimasukkannya ke dalam bahasa inti (atau hanya untuk disediakan sebagai bagian dari beberapa kode paket ketika benar-benar dibutuhkan)? Itulah pertanyaan bagi saya di sini dan sejauh ini saya belum melihat benar-benar argumen yang mendukung penyertaannya.

Anda dapat mengajukan pertanyaan yang sama untuk "apakah itu dimensi", "apakah itu lewati", "apakah itu hanya huruf", "apakah itu mengandung karakter non-ascii", "apakah itu format tanggal", dan, dan, dan ... kemungkinannya cukup terbuka dan untuk sebagian besar dari mereka Anda dapat membuat satu atau dua kasus penggunaan. Tapi 99% dari waktu mereka hanya akan duduk di sana dan mengambil tempat. Dan sementara ruang bukanlah premium seperti di masa lalu, itu masih menambah kompleksitas dan pemeliharaan sistem inti. Jadi sekali lagi, apakah fungsi ini dengan penggunaan yang luas dan berulang? Jika ya, dan saya mendengar argumen yang meyakinkan untuk itu, itu bisa dianggap sebagai kandidat untuk dimasukkan. Jika tidak, itu harus diimplementasikan sebagai bagian dari kode yang membutuhkannya.

@FrankMittelbach Masalahnya khusus untuk biblatex di sini. Kami perlu menguji apakah beberapa bidang adalah bilangan bulat (pikirkan tentang nomor halaman) dan lakukan beberapa aritmatika di atasnya, dalam konteks yang dapat diperluas.
Ok ti spesifik tetapi bagian yang sulit adalah hal-hal yang dapat diperluas.
Mungkin tes semacam ini seharusnya hanya didokumentasikan. Membaca dokumen saya tidak tahu bagaimana melakukannya, dan terlebih lagi biblatex core berpikir tidak mungkin untuk menguji (memperluas comptabible) jika token jika bilangan bulat.

Mungkin solusinya adalah membuat regex dapat diperluas (saya pikir itu akan menyenangkan)

Jangan salah paham, saya sama sekali tidak menentang bahwa kami membantu Anda di sisi biblatex untuk membuat ini berfungsi, dan mungkin saja pada intinya kami kehilangan beberapa fungsi yang seharusnya ada di inti untuk mendukungnya. Maksud saya adalah bahwa inti harus membatasi dirinya pada kebutuhan yang "umum" dan untuk memberikan dasar umum dasar untuk menulis kode khusus, tetapi tidak menyediakan semua jenis ekstensi yang sangat jarang digunakan jika sama sekali (misalnya dalam hal ini ketika biblatex tidak digunakan). Kalau tidak, kita akan berakhir dengan serangkaian perintah yang sangat membengkak pada akhirnya.

Membuat segala sesuatunya bekerja secara lebih luas biasanya datang dengan label harga yang mahal, baik dalam fungsionalitas terbatas atau hilangnya kecepatan atau keduanya. Jadi saya ragu itu adalah ide yang baik untuk mencoba membuat regex dapat diperluas, tetapi saya membiarkan @blefloch mengomentari itu.

Tetapi tanpa mengetahui kasus penggunaan Anda secara lebih rinci: di suatu tempat bidang Anda sedang disiapkan dan itu tidak dilakukan secara meluas karena akan memerlukan penugasan, jadi pada tahap itu Anda dapat menentukan apakah Anda memiliki bilangan bulat atau sesuatu yang lain dan mencatat fakta itu yang bisa kemudian digunakan secara diperluas (tidak yakin itu membantu atau layak, tetapi itu akan menghindari pengujian lapangan berulang kali).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

dbitouze picture dbitouze  ·  43Komentar

josephwright picture josephwright  ·  12Komentar

EvanAad picture EvanAad  ·  49Komentar

josephwright picture josephwright  ·  31Komentar

stone-zeng picture stone-zeng  ·  25Komentar