функции в модуле (Fortran) [дубликат]

В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок.

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

0
задан Shaqpad 12 January 2015 в 05:35
поделиться

1 ответ

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

Однако, поскольку стандарт 90 и введение module s есть другие и лучшие способы предоставления информации о вызываемой функции вызывающей процедуре. Одним из таких способов является включение вызываемых функций в модуль и use -связать модуль. Когда ваша программа следует этому подходу, компилятор занимается вопросами. Это именно то, что сделал ваш код, и это не только правильно, это хороший подход в соответствии с современной практикой Фортрана.

association является стандартным для Fortran путь (ы), в котором имена (такие как fcn) становятся связанными с объектами, такими как функция, называемая fcn. use-association - это способ, реализованный путем записи use module в программном модуле, тем самым делая все имена в module доступными для устройства, которое использует module. Простой оператор использования делает все объекты в модуле известными под их именами, определенными модулем. Оператор use может быть изменен с помощью предложения only, что означает, что доступны только некоторые модули. Отдельные объекты модуля могут быть переименованы в оператор use, тем самым связывая другое имя с объектом модуля.

Сообщение об ошибке, которое вы получаете, если вы включаете (повторное) объявление типа вызываемой функции в вызывающей процедуре, возникает потому, что компилятор разрешает только одно объявление типа вызываемой функции.

2
ответ дан High Performance Mark 24 August 2018 в 02:06
поделиться
Другие вопросы по тегам:

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