Если вы не видите никакого результата из вашего кода PHP и / или видите части своего литерального исходного кода PHP на веб-странице вы можете быть уверены, что ваш PHP на самом деле не выполняется. Если вы используете View Source в своем браузере, вы, вероятно, видите весь исходный код PHP-файла. Поскольку PHP-код встроен в теги , браузер попытается интерпретировать их как HTML-теги, и результат может выглядеть несколько смущенным.
Чтобы на самом деле запустить ваши PHP-скрипты, вам нужно:
* Если вы не переконфигурируете его, все может быть настроено.
Это последнее особенно важно. Двойной щелчок по файлу, скорее всего, откроет его в вашем браузере, используя такой адрес, как:
file://C:/path/to/my/file.php
Это полностью обходит любой веб-сервер, который у вас может быть запущен, и файл не интерпретируется. Вам нужно посетить URL-адрес файла на вашем веб-сервере, вероятно, что-то вроде:
http://localhost/my/file.php
Вы также можете проверить, используете ли вы короткие открытые теги вместо
и ваша PHP-конфигурация отключила короткие открытые теги.
Также см. PHP-код не выполняется, вместо этого код отображается на странице
Короткий ответ:
[Примечание: существует" Шаблонный Haskell", который позволяет Вам записать макросы так же, как в Lisp, но строго говоря Вы никогда не должны потребность это.]
В первую очередь, не волнуйтесь о потере конкретных функций как динамический контроль типов. Поскольку Вы знакомы с языком Common LISP, замечательно хорошо разработанным языком, я предполагаю, что Вы знаете, что язык не может быть уменьшен до своего набора функций. Это - все о едином целом, не так ли?
В этом отношении, Haskell блистает так ярко, как язык Common LISP делает. Его функции объединяются для предоставления Вам способ запрограммировать, который делает код чрезвычайно коротким и изящным. Отсутствие макросов смягчено несколько более тщательно продуманным (но, аналогично, тяжелее чтобы понять и использовать) понятия как монады и стрелки. Статическая система типов добавляет к Вашему питанию вместо того, чтобы стоять на пути, как это делает на большинстве объектно-ориентированных языков.
, С другой стороны, программируя в Haskell является намного менее интерактивным, чем Lisp, и огромный объем отражения, существующего на языках как Lisp просто, не соответствует статичному представлению мира, который предполагает Haskell. Комплекты инструментальных средств, доступные Вам, поэтому очень отличаются между этими двумя языками, но трудно выдерживать сравнение друг с другом.
я лично предпочитаю Lisp способ запрограммировать в целом, поскольку я чувствую, что это соответствует способу, которым я работаю лучше. Однако это не означает, что Вы обязаны сделать так также.
Существует меньше потребности в метапрограммировании в Haskell, чем в языке Common LISP, потому что много может быть структурировано вокруг монад, и добавленный синтаксис заставляет встроенный DSLs выглядеть менее древовидным, но всегда существует Шаблон Haskell, как упомянуто ShreevatsaR, и даже Liskell (семантика Haskell + синтаксис Lisp), если Вам нравятся круглые скобки.
В Haskell можно определить, если функция, которая невозможна в LISP. Это возможно из-за лени, которая допускает больше модульного принципа в программах. Эта классическая бумага: то, Почему FP имеет значение John Hughes, объясняет, как лень улучшает composability.
В то время как я продолжаю свое Haskell-приобретение-знаний поездки, кажется, что одной вещью, которая помогает "заменить" макросы, является способность определить Ваши собственные инфиксные операторы и настроить их приоритет и ассоциативность. Отчасти сложный, но интересная система!
Я программист на Common Lisp.
Некоторое время назад я попробовал Haskell, и в итоге я решил придерживаться CL.
Причины:
Haskell, конечно, имеет свои достоинства и делает некоторые вещи принципиально другим способом, но он просто не сокращает его в долгосрочной перспективе для меня.
There are really cool things that you can achieve in Lisp with macros that are cumbersome (if possible) in Haskell. Take for example the `memoize' macro (see Chapter 9 of Peter Norvig's PAIP). With it, you can define a function, say foo, and then simply evaluate (memoize 'foo), which replaces foo's global definition with a memoized version. Can you achieve the same effect in Haskell with higher-order functions?
Что касается макросов, вот страница, где об этом говорится: Hello Haskell, Goodbye Lisp. Она объясняет точку зрения, согласно которой макросы в Haskell просто не нужны. Для сравнения приводится небольшой пример.
Пример случая, когда макрос LISP необходим, чтобы избежать оценки обоих аргументов :
(defmacro doif (x y) `(if ,x ,y))
Пример случая, когда Haskell систематически не оценивает оба аргумента, без необходимости в чем-либо вроде определения макроса :
doif x y = if x then (Just y) else Nothing
И вуаля