Re[2]: Тесто-типизированный язык
От: νsb Казахстан  
Дата: 29.11.22 06:52
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Так функция и не вызовется с другими типами, если код не менять.


Не понял. У нас типы выводятся в момент компиляции файла.

Грубо говоря у нас есть файл, в нём код и в нём же тесты. Мы сначала запускаем интерпретатор, который игнорирует типы. Этот интерпретатор прогоняет все тесты в этом файле и во время каждого вызова функции запоминает типы значений, которые эта функция принимала и возвращала. А также, видимо, типы переменных.

Эта запомненная информация где-то сохраняется и представляет из себя типизированную сигнатуру функции.

Простой пример:

function f(n) {
  let result;
  if (n == 0) {
    result = 1n;
  } else {
    const f1 = f(n - 1);
    result = BigInt(n) * f1;
  }
  return result;
}
tests {
  assert(f(0) == 1);
  assert(f(3) == 6);
}


Тут мы прогнав тесты видим, что функция вызывается с параметром типа number и возвращает BigInt при всех выполнениях. То бишь после выполнения куда-то записывается что-то вроде
function f(n: number): BigInt {
  let result: BigInt;
  if (n == 0) {
    result = 1n;
  } else {
    const f1: BigInt = f(n - 1);
    result = BigInt(n) * f1;
  }
  return result;
}


и теперь её из другого файла нельзя будет вызвать со строкой или null-ом, будет ошибка компиляции.

Наверное можно даже не просто number выводить, а что-то вроде uint8. Или вообще конкретный тип, от 0 до 3 в данном примере. Типа нужен факториал со значениями побольше — пиши тесты на значения побольше.

Б>Ну и непонятно, что дальше-то что с этими типами делать, какая задача решалась?


Проверять при использовании в других файлах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.