Существует ли быстрый запуск интерпретатор Haskell, подходящий для сценариев?

Вместо того, чтобы использовать display:none;, почему бы вам не использовать disabled prop?

В любом случае, вы могли бы сделать что-то подобное, получив каждые tr и проверив, если input s отключены Если вы действительно хотите использовать display:none, просто замените

input.disabled на input.style.display === "none"

Если все входы в tr отключены, строка таблицы будет скрыта. [1120 ]

  • Используйте addEventListener, чтобы убедиться, что страница загружена перед запуском вашего javascript ИЛИ , чтобы ваш скрипт был в конце вашей HTML-страницы.

  • style="display=none" неверно. Используйте style="display:none;"

window.addEventListener("load", ()=>{
  Array.from(document.getElementsByTagName("tr")).forEach(tr => {
  
      const shouldDisable = 
        Array.from(tr.querySelectorAll("input"))
        .every(input => input.disabled);
      
      if(shouldDisable){
          tr.style.display = "none"
      }
  });
});
<form id="formid">
  <table>
    <tbody>
      <tr>
        <td>
          <input type="checkbox">
          <input type="text" style="display:none;">
        </td>
      </tr>
      <tr>
        <td>
          <input type="checkbox "  style="display:none;">
          <input type="text"  style="display:none;">
        </td>
      </tr>
    </tbody>
  </table>
  <table>
    <tbody>
      <tr>
        <td>
          <input type="checkbox"  style="display:none;">
          <input type="text"  style="display:none;">
        </td>
      </tr>
      <tr>
        <td>
          <input type="checkbox "  style="display:none;">
          <input type="text "  style="display:none;">
        </td>
      </tr>
    </tbody>

18
задан Norman Ramsey 4 April 2009 в 03:25
поделиться

4 ответа

Используя ghc -e в значительной степени эквивалентно вызову ghci. Я полагаю что GHC's runhaskell компилирует код во временный исполняемый файл прежде, чем выполнить его, в противоположность интерпретации его как ghc -e/ghci, но я не на 100% уверен.

$ time echo 'Hello, world!'
Hello, world!

real    0m0.021s
user    0m0.000s
sys     0m0.000s
$ time ghc -e 'putStrLn "Hello, world!"'
Hello, world!

real    0m0.401s
user    0m0.031s
sys     0m0.015s
$ echo 'main = putStrLn "Hello, world!"' > hw.hs
$ time runhaskell hw.hs
Hello, world!

real    0m0.335s
user    0m0.015s
sys     0m0.015s
$ time ghc --make hw
[1 of 1] Compiling Main             ( hw.hs, hw.o )
Linking hw ...

real    0m0.855s
user    0m0.015s
sys     0m0.015s
$ time ./hw
Hello, world!

real    0m0.037s
user    0m0.015s
sys     0m0.000s

Как трудно это должно просто скомпилировать все Ваши "сценарии" прежде, чем выполнить их?

Править

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

К сожалению, я не думаю, что возможно сделать любой запуск компилятора Haskell наверху немного лучше. Декларативный характер языка означает, что необходимо прочитать всю программу сначала даже прежде, чем попробовать к typecheck что-либо, nevermind выполнение и затем Вы или перенести стоимость анализа строгости или ненужной лени и преобразования.

Популярные языки 'сценариев' (оболочка, Perl, Python, и т.д.) и основанные на ML языки требуют только единственной передачи... хорошо хорошо, ML требует статической передачи typecheck, и Perl имеет эту забавную схему с 5 передачами (с двумя из них работающий наоборот); так или иначе быть процедурным означает, что компилятор/интерпретатор имеет намного легче из задания, собирающего биты программы вместе.

Короче говоря, я не думаю, что возможно стать намного лучше, чем это. Я не протестировал, чтобы видеть, имеют ли Объятия или GHCi более быстрый запуск, но какое-либо различие, там все еще faaar далеко от языков non-Haskell.

8
ответ дан 30 November 2019 в 06:22
поделиться

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

5
ответ дан 30 November 2019 в 06:22
поделиться

У Вас есть две части к этому вопросу:

  • Вы заботитесь о производительности
  • Вы хотите писать сценарий

Если Вы заботитесь о производительности, единственная серьезная опция является GHC, который очень очень быстр: http://shootout.alioth.debian.org/u64q/benchmark.php?test=all&lang=all

Если бы Вы хотите что-то легкое для сценариев Unix, я использовал бы GHCi. Это о 30x быстрее, чем Объятия, но также и поддерживает все библиотеки по hackage.

Так установите GHC теперь (и получите GHCi бесплатно).

4
ответ дан 30 November 2019 в 06:22
поделиться

Почему бы не создать скрипт front-end, который компилирует скрипт, если он не был скомпилирован ранее или если скомпилированная версия устарела.

Вот основная идея, этот код можно улучшить - искать путь, а не считать, что все находится в одной директории, лучше обрабатывать другие расширения файлов и т.д. Также я довольно зеленый в кодировании haskell (ghc-compiled-script.hs):

import Control.Monad
import System
import System.Directory
import System.IO
import System.Posix.Files
import System.Posix.Process
import System.Process

getMTime f = getFileStatus f >>= return . modificationTime

main = do
  scr : args <- getArgs
  let cscr = takeWhile (/= '.') scr

  scrExists <- doesFileExist scr
  cscrExists <- doesFileExist cscr
  compile <- if scrExists && cscrExists
               then do
                 scrMTime <- getMTime scr
                 cscrMTime <- getMTime cscr
                 return $ cscrMTime <= scrMTime
               else
                   return True

  when compile $ do
         r <- system $ "ghc --make " ++ scr
         case r of
           ExitFailure i -> do
                   hPutStrLn stderr $
                            "'ghc --make " ++ scr ++ "' failed: " ++ show i
                   exitFailure
           ExitSuccess -> return ()

  executeFile cscr False args Nothing

Теперь мы можем создавать скрипты, такие как этот (hs-echo.hs):

#! ghc-compiled-script

import Data.List
import System
import System.Environment

main = do
  args <- getArgs
  putStrLn $ foldl (++) "" $ intersperse " " args

А теперь запускаем его:

$ time hs-echo.hs "Hello, world\!"     
[1 of 1] Compiling Main             ( hs-echo.hs, hs-echo.o )
Linking hs-echo ...
Hello, world!
hs-echo.hs "Hello, world!"  0.83s user 0.21s system 97% cpu 1.062 total

$ time hs-echo.hs "Hello, world, again\!"
Hello, world, again!
hs-echo.hs "Hello, world, again!"  0.01s user 0.00s system 60% cpu 0.022 total
31
ответ дан 30 November 2019 в 06:22
поделиться
Другие вопросы по тегам:

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