действительно ли возможно воспроизвести строковую интерполяцию Python в ocaml?

В Python можно использовать printf как форматирование с оператором "%":

"i am %d years old" % 99

или

"%s is %d years old" % ("bob", 101)

Существует ли способ получить тот же краткий синтаксис в Ocaml для произвольных чисел аргументов?

Для отдельного аргумента, следующих работ:

let (%) = Printf.sprintf in ... "i am %d years old" % 99

Существует ли путь, который работает на произвольные числа аргументов?

11
задан Joe Doyle 1 May 2012 в 01:38
поделиться

3 ответа

Теоретически, не кажется более сложным использовать формат для получения типа (typ1 * typ2 * ... * typn) -> string чем typ1 -> typ2 -> ... -> typn -> string. То есть, возможно, за исключением рекурсивных форматов %( fmt %). Кто-нибудь на самом деле их использует?

На практике, однако, реализаторы OCaml выбрали вторую форму, и реализовали взлом системы типов для этой формы, а не для первой. Так что, боюсь, ответ на этот вопрос таков: за неимением исправления компилятора, вы застряли с curried формой подстановки строки формата.

1
ответ дан 3 December 2019 в 10:26
поделиться

Это зависит от того, что вы подразумеваете под произвольным числом аргументов:

  • Я не верю, что есть способ написать функцию в OCaml, которая может принимать и распаковывать кортеж произвольной арности (например, , оба (1, «bob») и («joe», «bob», «briggs») ).

  • Caml способ обработки нескольких аргументов не через кортежи, а путем каррирования. Если вы хотите это сделать, вы можете просто использовать Printf.sprintf .

  • Если вам действительно нужен инфиксный оператор, например, что-то вроде

     "% s-% s% s - лучший обозреватель фильмов"% "joe" "bob" "briggs" 
     

    тогда вам не повезло, потому что приложение-функция связывает более жестко, чем любой инфиксный оператор . Вы можете написать

     ("% s-% s% s - лучший рецензент фильмов"% "joe") "bob" "briggs" 
     

    , но мне это кажется неважным - не дроидов, которых вы ищете.

Итак, если ваш вопрос:

Могу ли я определить в Objective Caml инфиксную версию sprintf , которая принимает произвольное количество аргументов?

Ответ это нет.

8
ответ дан 3 December 2019 в 10:26
поделиться

Просто вычтите число:

> as.Date("2009-10-01")
[1] "2009-10-01"
> as.Date("2009-10-01")-5
[1] "2009-09-26"

Поскольку класс Date имеет только дни, над ним можно просто выполнить базовую арифметику.

Если вы хотите использовать POSIXlt по какой-либо причине, то вы можете использовать слоты POSIXlt:

> a <- as.POSIXlt("2009-10-04")
> names(unclass(as.POSIXlt("2009-10-04")))
[1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"
> a$mday <- a$mday - 6
> a
[1] "2009-09-28 EDT"
-121--1095061-

Может быть, вы можете использовать библиотеку typeinfo, с ней вы можете теперь класс объектов во время выполнения. Пример:

#include<iostream>

#include<typeinfo>
class A{};

int main()
{
A a;

std::cout<<typeid(a).name();

}

Вы можете увидеть больше в: http://www.cplusplus.com/reference/std/typeinfo/

[]

-121--3909698-

Это звучит как работа для Camlp4 !

0
ответ дан 3 December 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: