программа воспроизводить себя и быть полезной - не суета - PullRequest
1 голос
/ 23 января 2012

У меня есть программа, которая выполняет полезную задачу. Теперь я хочу создать исходный текст в виде простого текста при запуске скомпилированного исполняемого файла, в дополнение к выполнению исходной задачи. Это не quine, но, вероятно, связано.

Эта возможность была бы полезна в целом, но моя конкретная программа написана на Fortran 90 и использует шаблоны Mako. При компиляции он имеет доступ к исходным файлам исходного кода, но я хочу быть в состоянии гарантировать, что источник существует, когда пользователь запускает исполняемый файл.

Возможно ли это сделать?

Вот пример простого Фортрана 90, который выполняет простую задачу.

program exampl
  implicit none
  write(*,*) 'this is my useful output'
end program exampl

Можно ли изменить эту программу так, чтобы она выполняла ту же задачу (выводит строку при компиляции) и выводит текстовый файл Fortran 90, содержащий источник?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 23 января 2012

Прошло так много времени с тех пор, как я коснулся Fortran (и я никогда не имел дело с Fortran 90), что я не уверен, но я вижу базовый подход, который должен работать, пока язык поддерживает строковые литералы в коде.

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

Очевидно, это означает, что у вас есть две копии источника, одна внутри другой,Поскольку это уродливо, я бы не стал так делать, а просто сохранил ваш исходный код с токеном include_me и запустил его через программу, которая создает вложенные файлы перед тем, как вы скомпилируете их.Обратите внимание, что эта программа поделится приличным количеством кода с подпрограммой, которая воссоздает код из блока литералов.Если вы собираетесь пойти по этому пути, я бы также сделал так, чтобы программа выкладывала исходный код этой программы, чтобы тому, кто пытается изменить файлы, не приходилось иметь дело с двумя копиями.

0 голосов
/ 24 января 2012

Моя оригинальная программа (см. Вопрос) отредактирована: добавьте оператор включения

Назовите этот файл "exampl.f90"

program exampl
  implicit none
  write(*,*) "this is my useful output"
  open(unit=2,file="exampl_out.f90")
  include "exampl_source.f90"
  close(2)
end program exampl

Затем другая программа (в данном случае написанная на Python)) читает этот источник

import os
f=open('exampl.f90') # read in exampl.f90
g=open('exampl_source.f90','w') # and replace each line with write(*,*) 'line'
for line in f:
  #print 'write(2,*) \''+line.rstrip()+'\'\n',
  g.write('write(2,*) \''+line.rstrip()+'\'\n')
f.close
g.close
# then complie exampl.f90 (which includes exampl_source.f90)
os.system('gfortran exampl.f90')
os.system('/bin/rm exampl_source.f90')

Запуск этого скрипта на python создает исполняемый файл.Когда исполняемый файл запускается, он выполняет исходную задачу И печатает исходный код.

...